"use client";
import { Button } from "@/components/ui/button";
import {
  Sheet,
  SheetContent,
  SheetDescription,
  SheetHeader,
  SheetTitle,
  SheetTrigger,
  SheetFooter,
  SheetClose,
} from "@/components/ui/sheet";
import { MdModeEdit } from "react-icons/md";
import { trpc } from "@/app/_trpc/client";
import { useEffect, useMemo, useState } from "react";
import { useToast } from "../ui/use-toast";
import {
  Form,
  FormControl,
  FormDescription,
  FormField,
  FormItem,
  FormLabel,
  FormMessage,
} from "../ui/form";
import { z } from "zod";
import {
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue,
} from "../ui/select";
import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover";
import {
  addLocalOffsetFromDate,
  cn,
  formatDate,
} from "@/lib/utils";
import { CalendarIcon } from "lucide-react";
import { Calendar } from "../ui/calendar";
import moment from "moment";
import useFormHandler from "@/hooks/useFormHandler";
import { updateTaskSchema } from "@/lib/schemas/taskSchema";
import { Task, taskStatus, TaskStatus } from "@/server/task/domain/models";

const STATUS_ENUM = taskStatus

const STATUS_ENUM_EMPLOYEE = ["no iniciada", "en proceso", "completada"];



const ModifyTaskSidebar = ({
  selectedTask,
  isEmployeeEdit,
}: {
  selectedTask: Task;
  isEmployeeEdit?: boolean;
}) => {
  const utils = trpc.useUtils();
  const { toast } = useToast();
  const [open, setOpen] = useState<boolean>(false);

  const defaultValues: z.infer<typeof updateTaskSchema> = {
    id: '',
    status: "no iniciada",
    userId: "",
    priority: "baja",
    startDate: undefined,
    expireDate: undefined,
  };

  const { form, isInputChanged, setIsInputChanged,getChangedFields } = useFormHandler(
    updateTaskSchema,
    defaultValues
  );

  const { data: users, isPending: isPendingUsers } =
    trpc.users.getUsers.useQuery();

  useEffect(() => {
    if (selectedTask) {
       form.reset({
        projectId: selectedTask?.projectId,
        projectName: selectedTask?.projectName,
        areaName: selectedTask?.areaName,
        areaId: selectedTask?.areaId,
        floorName: selectedTask?.floorName,
        priority: selectedTask?.priority,
        status: selectedTask?.status,
        userId: selectedTask?.user?.id,
        id: selectedTask?.id,
        startDate:
          selectedTask?.startDate > formatDate(new Date())!
            ? selectedTask?.startDate
            : undefined,
        expireDate:
          selectedTask?.expireDate &&
          selectedTask.startDate > formatDate(new Date())!
            ? selectedTask?.expireDate
            : undefined,
      })
    }
  }, [selectedTask, form]);

  const { mutate: updateTaskMutation, isPending } = trpc.tasks.updateTask.useMutation({
    onSuccess: () => {
      setOpen(false);
      utils.tasks.getProjectTasks.invalidate();
      utils.tasks.getRecentModifiedTasks.invalidate();
      if (isEmployeeEdit) {
        utils.users.getUserActiveTasks.invalidate();
        utils.tasks.getTasks.invalidate()
        utils.users.getUserMonthActivity.invalidate()
      }
      // invalidar projecto a la que pertenece tarea
      if (selectedTask?.projectId) {
        utils.projects.getProjectById.invalidate({value:selectedTask?.projectId});
      }
      toast({
        title: "Exito",
        description: "Tarea actualizada con exito",
        variant: "default",
      });
      setIsInputChanged(false);
    },
    onError: (opts) => {
      toast({
        title: "Error",
        description: opts?.message,
        variant: "destructive",
      });
    },
  });

  function onSubmit(values: z.infer<typeof updateTaskSchema>) {
    const changedFields = getChangedFields(values)
    updateTaskMutation({
      id:values.id,
      projectName:values.projectName,
      floorName:values.floorName,
      areaName:values.areaName,
      areaId:values.areaId,
      ...changedFields
    });
  }


  const enumPriorityByRol = useMemo(() => {
    return isEmployeeEdit ? STATUS_ENUM_EMPLOYEE : STATUS_ENUM;
  }, [isEmployeeEdit]);

  return (
    <Sheet open={open} onOpenChange={setOpen}>
      <SheetTrigger>
        {isEmployeeEdit ? (
          <span className="text-2xl text-right font-bold">...</span>
        ) : (
          <MdModeEdit className="text-2xl text-blue-800 " />
        )}
      </SheetTrigger>
      <SheetContent>
        <SheetHeader>
          <SheetTitle>Editar tarea</SheetTitle>
          <SheetDescription>Modificar tarea asignada</SheetDescription>
        </SheetHeader>

        <Form {...form}>
          <form onSubmit={form.handleSubmit(onSubmit)}>
            <div className="grid gap-4 py-4 mt-10">
              {!isEmployeeEdit ? (
                <>
                  <FormField
                    control={form.control}
                    name="userId"
                    render={({ field }) => (
                      <FormItem>
                        <FormLabel>Usuario asignado</FormLabel>
                        <Select
                          onValueChange={field.onChange}
                          defaultValue={field.value}
                        >
                          <FormControl>
                            <SelectTrigger>
                              <SelectValue placeholder="Select a verified email to display" />
                            </SelectTrigger>
                          </FormControl>
                          <SelectContent>
                            {users &&
                              users.length > 0 &&
                              users?.map((user) => (
                                <SelectItem key={user?.id} value={user?.id}>
                                  {user?.firstName}
                                </SelectItem>
                              ))}
                          </SelectContent>
                        </Select>
                        <FormMessage />
                      </FormItem>
                    )}
                  />
                  
                  <FormField
                    control={form.control}
                    name="startDate"
                    render={({ field }) => (
                      <FormItem className="flex flex-col">
                        <FormLabel>Fecha de inicio</FormLabel>
                        <Popover>
                          <PopoverTrigger asChild>
                            <FormControl>
                              <Button
                                variant={"outline"}
                                className={cn(
                                  " pl-3 text-left font-normal w-full",
                                  !field.value && "text-muted-foreground"
                                )}
                              >
                                {field.value ? (
                                  moment(field.value).format("DD  MMM  YYYY")
                                ) : (
                                  <span>Escoje una fecha</span>
                                )}
                                <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
                              </Button>
                            </FormControl>
                          </PopoverTrigger>
                          <PopoverContent className="w-auto p-0" align="start">
                            <Calendar
                              mode="single"
                              selected={addLocalOffsetFromDate(field.value!)}
                              onSelect={(value) =>
                                field.onChange(formatDate(value))
                              }
                            />
                          </PopoverContent>
                        </Popover>
                        <FormMessage />
                      </FormItem>
                    )}
                  />
                  <FormField
                    control={form.control}
                    name="expireDate"
                    render={({ field }) => (
                      <FormItem className="flex flex-col">
                        <FormLabel>Fecha de expiracion</FormLabel>
                        <Popover>
                          <PopoverTrigger asChild>
                            <FormControl>
                              <Button
                                variant={"outline"}
                                className={cn(
                                  " pl-3 text-left font-normal w-full",
                                  !field.value && "text-muted-foreground"
                                )}
                              >
                                {field.value ? (
                                  moment(field.value).format("DD  MMM  YYYY")
                                ) : (
                                  <span>Escoje una fecha</span>
                                )}
                                <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
                              </Button>
                            </FormControl>
                          </PopoverTrigger>
                          <PopoverContent className="w-auto p-0" align="start">
                            <Calendar
                              mode="single"
                              selected={addLocalOffsetFromDate(field.value!)}
                              onSelect={(value) =>
                                field.onChange(formatDate(value))
                              }
                            />
                          </PopoverContent>
                        </Popover>
                        <FormMessage />
                      </FormItem>
                    )}
                  />
                  <FormField
                    control={form.control}
                    name="priority"
                    render={({ field }) => (
                      <FormItem>
                        <FormLabel>Prioridad</FormLabel>
                        <Select
                          onValueChange={field.onChange}
                          defaultValue={field.value}
                        >
                          <FormControl>
                            <SelectTrigger>
                              <SelectValue placeholder="Select a verified email to display" />
                            </SelectTrigger>
                          </FormControl>
                          <SelectContent>
                            {["baja", "media", "alta"].map((option) => (
                              <SelectItem key={option} value={option}>
                                {option}
                              </SelectItem>
                            ))}
                          </SelectContent>
                        </Select>

                        <FormMessage />
                      </FormItem>
                    )}
                  />
                </>
              ) : null}

              <FormField
                control={form.control}
                name="status"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>Estado</FormLabel>
                    <FormControl>
                      <Select
                        onValueChange={field.onChange}
                        defaultValue={field.value}
                      >
                        <SelectTrigger>
                          <SelectValue placeholder="Select a priority" />
                        </SelectTrigger>
                        <SelectContent>
                          {enumPriorityByRol.map((option) => (
                            <SelectItem key={option} value={option}>
                              {option}
                            </SelectItem>
                          ))}
                        </SelectContent>
                      </Select>
                    </FormControl>

                    <FormMessage />
                  </FormItem>
                )}
              />
            </div>

            <SheetFooter>
              <Button disabled={!isInputChanged || isPending} type="submit">
                {isPending ? "Guardando cambios..." : "Guardar cambios"}
              </Button>
            </SheetFooter>
          </form>
        </Form>

        <SheetFooter>
          <SheetClose asChild></SheetClose>
        </SheetFooter>
      </SheetContent>
    </Sheet>
  );
};

export default ModifyTaskSidebar;
