'use client';

import { useMemo } from 'react';
import { useMutation } from '@tanstack/react-query';
import { toast } from 'sonner';
import * as z from 'zod';
import { useAppForm, useFormFields } from '@/components/ui/tanstack-form';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { cn } from '@/lib/utils';
import { createTrainingPolicyMutation, updateTrainingPolicyMutation } from '../api/mutations';
import type { TrainingPolicy } from '../api/types';
import {
  DEFAULT_TRAINING_POLICY,
  getDefaultTrainingPolicyYear
} from '../constants/training-policy-defaults';
import { trainingPolicySchema, type TrainingPolicyFormValues } from '../schemas/training-policy';

export function TrainingPolicyForm({
  initialData,
  onSuccess,
  onCancelEdit,
  showCard = true
}: {
  initialData: TrainingPolicy | null;
  onSuccess?: () => void;
  onCancelEdit?: () => void;
  showCard?: boolean;
}) {
  const isEdit = Boolean(initialData);
  const defaultValues = useMemo(
    () =>
      ({
        year: initialData?.year ?? getDefaultTrainingPolicyYear(),
        totalHours: initialData?.total_hours ?? DEFAULT_TRAINING_POLICY.totalHours,
        kHours: initialData?.k_hours ?? DEFAULT_TRAINING_POLICY.kHours,
        sHours: initialData?.s_hours ?? DEFAULT_TRAINING_POLICY.sHours,
        aHours: initialData?.a_hours ?? DEFAULT_TRAINING_POLICY.aHours,
        isActive: initialData?.is_active ?? true
      }) as TrainingPolicyFormValues,
    [initialData]
  );

  const createMutation = useMutation({
    ...createTrainingPolicyMutation,
    onSuccess: () => {
      toast.success('สร้างนโยบายการอบรมเรียบร้อยแล้ว');
      onSuccess?.();
    },
    onError: (error) => {
      toast.error(error.message || 'ไม่สามารถสร้างนโยบายการอบรมได้');
    }
  });

  const updateMutation = useMutation({
    ...updateTrainingPolicyMutation,
    onSuccess: () => {
      toast.success('อัปเดตนโยบายการอบรมเรียบร้อยแล้ว');
      onSuccess?.();
    },
    onError: (error) => {
      toast.error(error.message || 'ไม่สามารถอัปเดตนโยบายการอบรมได้');
    }
  });

  const form = useAppForm({
    defaultValues,
    validators: {
      onSubmit: trainingPolicySchema
    },
    onSubmit: async ({ value }) => {
      if (isEdit && initialData) {
        updateMutation.mutate({
          id: initialData.id,
          values: value
        });
        return;
      }

      createMutation.mutate(value);
    }
  });

  const { FormTextField, FormSwitchField } = useFormFields<TrainingPolicyFormValues>();
  const categoryTotal =
    Number(form.state.values.kHours || 0) +
    Number(form.state.values.sHours || 0) +
    Number(form.state.values.aHours || 0);

  const content = (
    <>
      <div className='space-y-1'>
        <h2 className='text-lg font-semibold'>
          {isEdit ? 'แก้ไขนโยบายการอบรม' : 'สร้างนโยบายการอบรม'}
        </h2>
        <p className='text-muted-foreground text-sm'>
          กำหนดเป้าหมายชั่วโมงอบรมรายปีและสัดส่วน K/S/A สำหรับใช้คำนวณบนแดชบอร์ด
        </p>
      </div>

      <form.AppForm>
        <form.Form className='space-y-6 px-0 md:px-0'>
          <div className='grid grid-cols-1 gap-6 md:grid-cols-2'>
            <FormTextField
              name='year'
              label='ปีนโยบาย'
              required
              type='number'
              min={2000}
              max={2100}
              validators={{
                onBlur: z.number().int().min(2000, 'กรุณากรอกปีนโยบาย').max(2100)
              }}
            />

            <FormTextField
              name='totalHours'
              label='ชั่วโมงรวม'
              required
              type='number'
              min={0}
              step={0.5}
              validators={{
                onBlur: z.number().positive('กรุณากรอกชั่วโมงรวม')
              }}
            />

            <FormTextField
              name='kHours'
              label='ชั่วโมง K'
              required
              type='number'
              min={0}
              step={0.5}
              validators={{
                onBlur: z.number().min(0, 'กรุณากรอกชั่วโมง K')
              }}
            />

            <FormTextField
              name='sHours'
              label='ชั่วโมง S'
              required
              type='number'
              min={0}
              step={0.5}
              validators={{
                onBlur: z.number().min(0, 'กรุณากรอกชั่วโมง S')
              }}
            />

            <FormTextField
              name='aHours'
              label='ชั่วโมง A'
              required
              type='number'
              min={0}
              step={0.5}
              validators={{
                onBlur: z.number().min(0, 'กรุณากรอกชั่วโมง A')
              }}
            />

            <FormSwitchField
              name='isActive'
              label='ใช้งานนโยบายนี้'
              description='หากเปิดใช้งาน ระบบจะใช้ค่านี้เป็นนโยบายหลักขององค์กร'
            />
          </div>

          <div className='bg-muted/40 rounded-lg border px-4 py-3 text-sm'>
            ผลรวม K/S/A ปัจจุบัน: <span className='font-medium'>{categoryTotal}</span> /{' '}
            <span className='font-medium'>{form.state.values.totalHours || 0}</span> ชั่วโมง
          </div>

          <div
            className={cn(
              'flex flex-wrap justify-end gap-2',
              !showCard && 'border-t pt-4'
            )}
          >
            {isEdit ? (
              <Button type='button' variant='outline' onClick={onCancelEdit}>
                ยกเลิก
              </Button>
            ) : null}
            <form.SubmitButton>
              {isEdit ? 'อัปเดตนโยบาย' : 'สร้างนโยบาย'}
            </form.SubmitButton>
          </div>
        </form.Form>
      </form.AppForm>
    </>
  );

  if (!showCard) {
    return <div className='space-y-6'>{content}</div>;
  }

  return (
    <Card>
      <CardHeader className='flex flex-col gap-3 md:flex-row md:items-start md:justify-between'>
        <div className='space-y-1'>
          <CardTitle>{isEdit ? 'แก้ไขนโยบายการอบรม' : 'สร้างนโยบายการอบรม'}</CardTitle>
          <CardDescription>
            กำหนดเป้าหมายชั่วโมงอบรมรายปีและสัดส่วน K/S/A สำหรับใช้คำนวณบนแดชบอร์ด
          </CardDescription>
        </div>
        {isEdit ? (
          <Button type='button' variant='outline' onClick={onCancelEdit}>
            ยกเลิกการแก้ไข
          </Button>
        ) : null}
      </CardHeader>
      <CardContent>{content}</CardContent>
    </Card>
  );
}
