'use client';

import { useEffect, useMemo } from 'react';
import { z } from 'zod';
import { useMutation } from '@tanstack/react-query';
import { toast } from 'sonner';
import {
  Dialog,
  DialogContent,
  DialogDescription,
  DialogFooter,
  DialogHeader,
  DialogTitle
} from '@/components/ui/dialog';
import { Button } from '@/components/ui/button';
import { useAppForm, useFormFields } from '@/components/ui/tanstack-form';
import { Icons } from '@/components/icons';
import { assignEnquiryMutation, reassignEnquiryMutation } from '../api/mutations';
import type { EnquiryRecord, EnquiryReferenceData } from '../api/types';

const enquiryAssignmentSchema = z.object({
  assignedToUserId: z.string().min(1, 'Sales user is required'),
  remark: z.string().optional()
});

type EnquiryAssignmentFormValues = z.infer<typeof enquiryAssignmentSchema>;

function toDefaultValues(
  enquiry: EnquiryRecord,
  referenceData: EnquiryReferenceData
): EnquiryAssignmentFormValues {
  return {
    assignedToUserId: enquiry.assignedToUserId ?? referenceData.assignableUsers[0]?.id ?? '',
    remark: enquiry.assignmentRemark ?? ''
  };
}

export function EnquiryAssignmentDialog({
  enquiry,
  referenceData,
  mode,
  open,
  onOpenChange
}: {
  enquiry: EnquiryRecord;
  referenceData: EnquiryReferenceData;
  mode: 'assign' | 'reassign';
  open: boolean;
  onOpenChange: (open: boolean) => void;
}) {
  const defaultValues = useMemo(
    () => toDefaultValues(enquiry, referenceData),
    [enquiry, referenceData]
  );
  const { FormSelectField, FormTextareaField } = useFormFields<EnquiryAssignmentFormValues>();

  const assignMutation = useMutation({
    ...assignEnquiryMutation,
    onSuccess: () => {
      toast.success('ส่งต่อลีดไปยังฝ่ายขายสำเร็จ');
      onOpenChange(false);
    },
    onError: (error) =>
      toast.error(error instanceof Error ? error.message : 'ไม่สามารถมอบหมายโอกาสขายได้')
  });

  const reassignMutation = useMutation({
    ...reassignEnquiryMutation,
    onSuccess: () => {
      toast.success('เปลี่ยนผู้ดูแลโอกาสขายสำเร็จ');
      onOpenChange(false);
    },
    onError: (error) =>
      toast.error(error instanceof Error ? error.message : 'ไม่สามารถเปลี่ยนผู้ดูแลโอกาสขายได้')
  });

  const form = useAppForm({
    defaultValues,
    validators: {
      onSubmit: enquiryAssignmentSchema
    },
    onSubmit: async ({ value }) => {
      const values = {
        assignedToUserId: value.assignedToUserId,
        remark: value.remark?.trim() || undefined
      };

      if (mode === 'assign') {
        await assignMutation.mutateAsync({ id: enquiry.id, values });
        return;
      }

      await reassignMutation.mutateAsync({ id: enquiry.id, values });
    }
  });

  useEffect(() => {
    if (!open) {
      return;
    }

    form.reset(defaultValues);
  }, [defaultValues, form, open]);

  const isPending = assignMutation.isPending || reassignMutation.isPending;
  const noUsersAvailable = referenceData.assignableUsers.length === 0;

  return (
    <Dialog open={open} onOpenChange={onOpenChange}>
      <DialogContent>
        <DialogHeader>
          <DialogTitle>{mode === 'assign' ? 'ส่งต่อให้ฝ่ายขาย' : 'เปลี่ยนผู้ดูแลโอกาสขาย'}</DialogTitle>
          <DialogDescription>
            {mode === 'assign'
              ? 'มอบหมายลีดนี้ให้ฝ่ายขายเพื่อเปลี่ยนเป็นโอกาสขาย'
              : 'เปลี่ยนผู้ดูแลโอกาสขายและเก็บบันทึกการส่งต่องานไว้'}
          </DialogDescription>
        </DialogHeader>

        <form.AppForm>
          <form.Form id='enquiry-assignment-form' className='px-0 md:px-0'>
            {noUsersAvailable ? (
              <div className='text-muted-foreground rounded-lg border border-dashed p-4 text-sm'>
                ยังไม่มีผู้ใช้ฝ่ายขายที่สามารถมอบหมายงานได้ใน workspace นี้
              </div>
            ) : (
              <>
                <FormSelectField
                  name='assignedToUserId'
                  label='ผู้ดูแลโอกาสขาย'
                  required
                  options={referenceData.assignableUsers.map((user) => ({
                    value: user.id,
                    label: `${user.name} (${user.businessRole.replaceAll('_', ' ')})`
                  }))}
                  placeholder='เลือกผู้ใช้ฝ่ายขาย'
                />
                <FormTextareaField
                  name='remark'
                  label='หมายเหตุ'
                  placeholder='บริบทเพิ่มเติมหรือหมายเหตุประกอบการส่งต่องาน'
                />
              </>
            )}
          </form.Form>
        </form.AppForm>

        <DialogFooter>
          <Button type='button' variant='outline' onClick={() => onOpenChange(false)}>
            ยกเลิก
          </Button>
          <Button
            type='submit'
            form='enquiry-assignment-form'
            isLoading={isPending}
            disabled={noUsersAvailable}
          >
            <Icons.userPen className='mr-2 h-4 w-4' />
            {mode === 'assign' ? 'ส่งต่อให้ฝ่ายขาย' : 'เปลี่ยนผู้ดูแล'}
          </Button>
        </DialogFooter>
      </DialogContent>
    </Dialog>
  );
}
