import {
  FormControl,
  FormDescription,
  FormField,
  FormItem,
  FormLabel,
  FormMessage,
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue,
} from "@repo/shadcn-ui/components";

import { cn } from "@repo/shadcn-ui/lib/utils";
import { Control, FieldPath, FieldValues, useController, useFormState } from "react-hook-form";
import { useTranslation } from "../../locales/i18n.ts";

type SelectFieldProps<TFormValues extends FieldValues> = {
  control: Control<TFormValues>;
  name: FieldPath<TFormValues>;
  items: Array<{ value: string; label: string }>;
  label?: string;
  placeholder?: string;
  description?: string;
  disabled?: boolean;
  required?: boolean;
  readOnly?: boolean;
  className?: string;
};

export function SelectField<TFormValues extends FieldValues>({
  control,
  name,
  items,
  label,
  placeholder,
  description,
  disabled = false,
  required = false,
  readOnly = false,
  className,
}: SelectFieldProps<TFormValues>) {
  const { t } = useTranslation();

  const { isSubmitting, isValidating } = useFormState({ control, name });
  const { field, fieldState } = useController({ control, name });

  const isDisabled = disabled || readOnly;

  return (
    <FormField
      control={control}
      name={name}
      render={({ field }) => (
        <FormItem className={cn("space-y-0", className)}>
          {label && (
            <div className='mb-1 flex justify-between'>
              <div className='flex items-center gap-2'>
                <FormLabel htmlFor={name} className='m-0'>
                  {label}
                </FormLabel>
                {required && (
                  <span className='text-xs text-destructive'>{t("common.required")}</span>
                )}
              </div>
              {/* Punto “unsaved” */}
              {fieldState.isDirty && (
                <span className='text-[10px] text-muted-foreground'>{t("common.modified")}</span>
              )}
            </div>
          )}
          <Select onValueChange={field.onChange} defaultValue={field.value} disabled={isDisabled}>
            <FormControl>
              <SelectTrigger className='w-full bg-background h-8'>
                <SelectValue
                  placeholder={placeholder}
                  className=' placeholder:font-normal placeholder:italic '
                />
              </SelectTrigger>
            </FormControl>
            <SelectContent>
              {items.map((item) => (
                <SelectItem key={`key-${item.value}`} value={item.value}>
                  {item.label}
                </SelectItem>
              ))}
            </SelectContent>
          </Select>

          <FormDescription className={cn("text-xs truncate", !description && "invisible")}>
            {description || "\u00A0"}
          </FormDescription>
          <FormMessage />
        </FormItem>
      )}
    />
  );
}
