/* eslint-disable react-hooks/rules-of-hooks */
"use client";
import React, { useState } from "react";
import { useQuery } from "@tanstack/react-query";
import { Checkbox } from "@radix-ui/react-checkbox";
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { Button } from "@/components/ui/button";

import { Input } from '@/components/ui/input'
import { Separator } from '@/components/ui/separator'
import { Eye, Pencil, PlusCircle, SearchIcon, Vote } from 'lucide-react'

import { ColumnDef } from "@tanstack/react-table";

import { DotsHorizontalIcon } from "@radix-ui/react-icons";
import DataTable from "@/components/Table";
import Modal from "@/components/modal";
import Loading from "@/app/(dashoard)/components/loading";
import { ErrorMessage } from "@/components/ui/error-message";
import { VoteFormDialog } from "./component/vote-form-popover";

import Image from "next/image"
import { ViewVoteDialog } from "./component/view-vote-popover";
import { UpdateVoteFormDialog } from "./component/update-vote-form";

import { getVotes } from "@/lib/features/admin/vote/service";
import { VoteProps } from "@/lib/features/admin/vote/type";

const VotePage = () => {


  // merge branches
  const [selectedId, setSelectedId] = useState<number | null>(null);


  /////////////////view user modal
  const [isViewModalOpen, setViewModalOpen] = useState(false);

  const openViewModal = (id: number) => {
    setSelectedId(id);
    setViewModalOpen(true);
  };

  const closeViewModal = () => {
    setViewModalOpen(false);
    setSelectedId(null);
  };



  /////////////////update quiz modal
  const [isUpdateModalOpen, setUpdateModalOpen] = useState(false);

  const openUpdateModal = (id: number) => {
    setSelectedId(id);
    setUpdateModalOpen(true);
  };

  const closeUpdateModal = () => {
    setUpdateModalOpen(false);
    setSelectedId(null);
  };

  /////////////////create course modal
  const [isAddModalOpen, setAddModalOpen] = useState(false);

  const openAddModal = () => {
    setAddModalOpen(true);
  };

  const closeAddModal = () => {
    setAddModalOpen(false);
  };



  // votes
  const { data, isLoading, error, refetch } = useQuery({
    queryKey: ["vote-list"],
    queryFn: () => getVotes(),
  });


  // handle refresh
  const handleRefresh = () => {
    refetch();
  };

  if (isLoading) {
    return <Loading />;
  }


  //error
  if (error) {
    return <ErrorMessage error={error} fallback="Dashboard error" />
  }

  const rowData: VoteProps[] = data?.data || [];

  //columns
  const columns: ColumnDef<VoteProps>[] = [
    {
      id: "select",
      header: ({ table }) => (
        <Checkbox
          checked={
            table.getIsAllPageRowsSelected() ||
            (table.getIsSomePageRowsSelected() && "indeterminate")
          }
          onCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)}
          aria-label="Select all"
        />
      ),
      cell: ({ row }) => (
        <Checkbox
          checked={row.getIsSelected()}
          onCheckedChange={(value) => row.toggleSelected(!!value)}
          aria-label="Select row"
        />
      ),
      enableSorting: false,
      enableHiding: false,
    },

    {
      accessorKey: "image",
      header: () => <div className="text-left table-size">Photo</div>,
      cell: ({ row }) => {
        return (
          <div className="text-left font-normal table-size" onClick={() => openViewModal(row?.original?.id)}>
            <Image
              src={`${row.getValue("image")}`}
              alt={row?.original?.title}
              width={200}
              height={200}
              className="rounded-2xl shadow-2xl"
            />
          </div>
        );
      },
    },

    {
      accessorKey: "title",
      header: () => <div className="text-left table-size">Title</div>,
      cell: ({ row }) => {
        return (
          <div className="text-left font-normal table-size" onClick={() => openViewModal(row?.original?.id)}>
            {row.getValue("title")}
          </div>
        );
      },
    },


    {
      accessorKey: "description",
      header: () => <div className="text-left table-size">Description</div>,
      cell: ({ row }) => {
        return (
          <div className="text-left font-normal table-size" onClick={() => openViewModal(row?.original?.id)}>
            {row.getValue("description")}
          </div>
        );
      },
    },

    {
      accessorKey: "voted",
      header: () => <div className="text-left table-size">Voted</div>,
      cell: ({ row }) => {
        return (
          <div className="text-left font-normal table-size" onClick={() => openViewModal(row?.original?.id)}>
            <b className="text-blue-500">
              {row.getValue("voted")}
            </b>
          </div>
        );
      },
    },

    {
      accessorKey: "date",
      header: () => <div className="text-left table-size">Date</div>,
      cell: ({ row }) => {
        return (
          <div className="text-left font-normal table-size" onClick={() => openViewModal(row?.original?.id)}>
            {row.getValue("date")}
          </div>
        );
      },
    },

    {
      accessorKey: "open",
      header: () => <div className="text-left table-size">Open</div>,
      cell: ({ row }) => {
        return (
          <div className="text-left font-normal table-size" onClick={() => openViewModal(row?.original?.id)}>
            {row.getValue("open") === "1" ?
              <b className="text-green-500">YES</b>
              :
              <b className="text-red-500">NO</b>
            }
          </div>
        );
      },
    },


    {
      id: "actions",
      enableHiding: false,
      header: "Actions",
      cell: ({ row }) => {

        return (
          <DropdownMenu>
            <DropdownMenuTrigger asChild>
              <Button variant="ghost" className="h-8 w-8 p-0">
                <span className="sr-only">Open menu</span>
                <DotsHorizontalIcon className="h-4 w-4" />
              </Button>
            </DropdownMenuTrigger>
            <DropdownMenuContent align="end">
              <DropdownMenuSeparator />

              <DropdownMenuItem onClick={() => openViewModal(row?.original?.id)}>
                <Eye />
                View
              </DropdownMenuItem>

              <>
                <DropdownMenuItem onClick={() => openUpdateModal(row?.original?.id)}>
                  <Pencil className="text-blue-500" />
                  Update
                </DropdownMenuItem>
              </>



            </DropdownMenuContent>
          </DropdownMenu>
        );
      },
    },
  ];

  return (
    <>

      {/**************** Add vote  modal */}
      <Modal isOpen={isAddModalOpen} onClose={closeAddModal} size="md">
        <VoteFormDialog onCloseModal={closeAddModal} refreshNow={handleRefresh} />
      </Modal>

      {/**************** vote details modal ******/}
      <Modal isOpen={isViewModalOpen} onClose={closeViewModal} size="md" >
        <ViewVoteDialog dataId={Number(selectedId)} onCloseModal={closeViewModal} refreshNow={handleRefresh} />
      </Modal>

      {/**************** Update vote modal ******/}
      <Modal isOpen={isUpdateModalOpen} onClose={closeUpdateModal} size="md">
        <UpdateVoteFormDialog dataId={Number(selectedId)} onCloseModal={closeUpdateModal} refreshNow={handleRefresh} />
      </Modal>




      <div className="flex flex-row">
        <div className="flex items-center justify-between">
          <div className="space-y-1">
            <h4 className="text-2xl font-semibold tracking-tight flex gap-2">
              <Vote />
              Votes
            </h4>
          </div>
        </div>

        <div className="ml-auto mr-4 flex items-center space-x-3">
          <Input type="" placeholder="Search" />
          <Button className="px-4 py-2 button">
            <SearchIcon />
          </Button>
        </div>

        <div className="ml-auto mr-4">

          <Button className="button" type="button" onClick={() => openAddModal()}>
            <PlusCircle className="mr-0 h-4 w-4" />
          </Button>

        </div>
      </div>

      <Separator className="my-0" />
      <div>
        <DataTable size={16} columns={columns} data={rowData} />
      </div>
    </>
  );
};

export default VotePage;