"use client"

import * as React from "react"
import { useForm } from "react-hook-form"
import { zodResolver } from "@hookform/resolvers/zod"
import { z } from "zod"
import { toast } from "sonner"
import { Button } from "@/components/ui/button"
import {
  Sheet,
  SheetContent,
  SheetDescription,
  SheetFooter,
  SheetHeader,
  SheetTitle,
} from "@/components/ui/sheet"
import {
  Form,
  FormControl,
  FormField,
  FormItem,
  FormLabel,
  FormMessage,
} from "@/components/ui/form"
import {
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue,
} from "@/components/ui/select"
import { Input } from "@/components/ui/input"
import { Textarea } from "@/components/ui/textarea"
import {
  GENERAL_CONTRACT_CATEGORIES,
  GENERAL_CONTRACT_TYPES,
  GENERAL_EXECUTION_METHODS,
} from "@/lib/general-contracts/types"
import { updateContract } from "../service"
import { GeneralContractListItem } from "./general-contracts-table-columns"
import { useSession } from "next-auth/react"
const updateContractSchema = z.object({
  category: z.string().min(1, "계약구분을 선택해주세요"),
  type: z.string().min(1, "계약종류를 선택해주세요"),
  executionMethod: z.string().min(1, "체결방식을 선택해주세요"),
  name: z.string().min(1, "계약명을 입력해주세요"),
  startDate: z.string().min(1, "계약시작일을 선택해주세요"),
  endDate: z.string().min(1, "계약종료일을 선택해주세요"),
  validityEndDate: z.string().min(1, "유효기간종료일을 선택해주세요"),
  contractScope: z.string().min(1, "계약확정범위를 선택해주세요"),
  notes: z.string().optional(),
  linkedRfqOrItb: z.string().optional(),
  linkedPoNumber: z.string().optional(),
  linkedBidNumber: z.string().optional(),
})

type UpdateContractFormData = z.infer<typeof updateContractSchema>

interface GeneralContractUpdateSheetProps {
  contract: GeneralContractListItem | null
  open: boolean
  onOpenChange: (open: boolean) => void
  onSuccess?: () => void
}

export function GeneralContractUpdateSheet({
  contract,
  open,
  onOpenChange,
  onSuccess,
}: GeneralContractUpdateSheetProps) {
  const [isSubmitting, setIsSubmitting] = React.useState(false)
  const session = useSession()
  const userId = session.data?.user?.id ? Number(session.data.user.id) : null
  const form = useForm<UpdateContractFormData>({
    resolver: zodResolver(updateContractSchema),
    defaultValues: {
      category: "",
      type: "",
      executionMethod: "",
      name: "",
      startDate: "",
      endDate: "",
      validityEndDate: "",
      contractScope: "",
      specificationType: "",
      specificationManualText: "",
      notes: "",
      linkedRfqOrItb: "",
      linkedPoNumber: "",
      linkedBidNumber: "",
    },
  })

  // 계약확정범위에 따른 품목정보 필드 비활성화 여부
  const watchedContractScope = form.watch("contractScope")
  const isItemsDisabled = watchedContractScope === '단가' || watchedContractScope === '물량(실적)'

  // 계약 데이터가 변경될 때 폼 초기화
  React.useEffect(() => {
    if (contract) {
      console.log("Loading contract data:", contract)
      const formData = {
        category: contract.category || "",
        type: contract.type || "",
        executionMethod: contract.executionMethod || "",
        name: contract.name || "",
        startDate: contract.startDate || "",
        endDate: contract.endDate || "",
        validityEndDate: contract.validityEndDate || "",
        contractScope: contract.contractScope || "",
        specificationType: contract.specificationType || "",
        specificationManualText: contract.specificationManualText || "",
        notes: contract.notes || "",
        linkedRfqOrItb: contract.linkedRfqOrItb || "",
        linkedPoNumber: contract.linkedPoNumber || "",
        linkedBidNumber: contract.linkedBidNumber || "",
      }
      console.log("Form data to reset:", formData)
      form.reset(formData)
    }
  }, [contract, form])

  const onSubmit = async (data: UpdateContractFormData) => {
    if (!contract) return

    try {
      setIsSubmitting(true)
      
      await updateContract(contract.id, {
        category: data.category,
        type: data.type,
        executionMethod: data.executionMethod,
        name: data.name,
        startDate: data.startDate,
        endDate: data.endDate,
        validityEndDate: data.validityEndDate,
        contractScope: data.contractScope,
        specificationType: data.specificationType,
        specificationManualText: data.specificationManualText,
        notes: data.notes,
        linkedRfqOrItb: data.linkedRfqOrItb,
        linkedPoNumber: data.linkedPoNumber,
        linkedBidNumber: data.linkedBidNumber,
        vendorId: contract.vendorId,
        lastUpdatedById: userId,
      })

      toast.success("계약 정보가 성공적으로 수정되었습니다.")
      onOpenChange(false)
      onSuccess?.()
    } catch (error) {
      console.error("Error updating contract:", error)
      toast.error("계약 정보 수정 중 오류가 발생했습니다.")
    } finally {
      setIsSubmitting(false)
    }
  }

  return (
    <Sheet open={open} onOpenChange={onOpenChange}>
      <SheetContent className="w-[800px] sm:max-w-[800px] flex flex-col" style={{width: 800, maxWidth: 800, height: '100vh'}}>
        <SheetHeader className="flex-shrink-0">
          <SheetTitle>계약 정보 수정</SheetTitle>
          <SheetDescription>
            계약의 기본 정보를 수정합니다. 변경사항은 즉시 저장됩니다.
          </SheetDescription>
        </SheetHeader>

        <div className="flex-1 overflow-y-auto min-h-0">
          <Form {...form}>
            <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6 h-full">
              <div className="grid gap-4 py-4">
              {/* 계약구분 */}
              <FormField
                control={form.control}
                name="category"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>계약구분 *</FormLabel>
                    <Select onValueChange={field.onChange} value={field.value}>
                      <FormControl>
                        <SelectTrigger>
                          <SelectValue placeholder="계약구분을 선택하세요" />
                        </SelectTrigger>
                      </FormControl>
                      <SelectContent>
                        {GENERAL_CONTRACT_CATEGORIES.map((category) => (
                          <SelectItem key={category} value={category}>
                            {category}
                          </SelectItem>
                        ))}
                      </SelectContent>
                    </Select>
                    <FormMessage />
                  </FormItem>
                )}
              />

              {/* 계약종류 */}
              <FormField
                control={form.control}
                name="type"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>계약종류 *</FormLabel>
                    <Select onValueChange={field.onChange} value={field.value}>
                      <FormControl>
                        <SelectTrigger>
                          <SelectValue placeholder="계약종류를 선택하세요" />
                        </SelectTrigger>
                      </FormControl>
                      <SelectContent>
                        {GENERAL_CONTRACT_TYPES.map((type) => (
                          <SelectItem key={type} value={type}>
                            {type}
                          </SelectItem>
                        ))}
                      </SelectContent>
                    </Select>
                    <FormMessage />
                  </FormItem>
                )}
              />

              {/* 체결방식 */}
              <FormField
                control={form.control}
                name="executionMethod"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>체결방식 *</FormLabel>
                    <Select onValueChange={field.onChange} value={field.value}>
                      <FormControl>
                        <SelectTrigger>
                          <SelectValue placeholder="체결방식을 선택하세요" />
                        </SelectTrigger>
                      </FormControl>
                      <SelectContent>
                        {GENERAL_EXECUTION_METHODS.map((method) => (
                          <SelectItem key={method} value={method}>
                            {method}
                          </SelectItem>
                        ))}
                      </SelectContent>
                    </Select>
                    <FormMessage />
                  </FormItem>
                )}
              />

              {/* 계약명 */}
              <FormField
                control={form.control}
                name="name"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>계약명 *</FormLabel>
                    <FormControl>
                      <Input placeholder="계약명을 입력하세요" {...field} />
                    </FormControl>
                    <FormMessage />
                  </FormItem>
                )}
              />

              {/* 계약시작일 */}
              <FormField
                control={form.control}
                name="startDate"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>계약시작일 *</FormLabel>
                    <FormControl>
                      <Input type="date" {...field} />
                    </FormControl>
                    <FormMessage />
                  </FormItem>
                )}
              />

              {/* 계약종료일 */}
              <FormField
                control={form.control}
                name="endDate"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>계약종료일 *</FormLabel>
                    <FormControl>
                      <Input type="date" {...field} />
                    </FormControl>
                    <FormMessage />
                  </FormItem>
                )}
              />

              {/* 유효기간종료일 */}
              <FormField
                control={form.control}
                name="validityEndDate"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>유효기간종료일 *</FormLabel>
                    <FormControl>
                      <Input type="date" {...field} />
                    </FormControl>
                    <FormMessage />
                  </FormItem>
                )}
              />

              {/* 계약확정범위 */}
              <FormField
                control={form.control}
                name="contractScope"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>계약확정범위 *</FormLabel>
                    <Select onValueChange={field.onChange} value={field.value}>
                      <FormControl>
                        <SelectTrigger>
                          <SelectValue placeholder="계약확정범위를 선택하세요" />
                        </SelectTrigger>
                      </FormControl>
                      <SelectContent>
                        <SelectItem value="단가">단가</SelectItem>
                        <SelectItem value="금액">금액</SelectItem>
                        <SelectItem value="물량(실적)">물량(실적)</SelectItem>
                      </SelectContent>
                    </Select>
                    <FormMessage />
                    <p className="text-sm text-muted-foreground">
                      해당 계약으로 확정되는 범위를 선택하세요.
                    </p>
                  </FormItem>
                )}
              />

              {/* 연계 견적/입찰번호 */}
              <FormField
                control={form.control}
                name="linkedRfqOrItb"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>연계 견적/입찰번호</FormLabel>
                    <FormControl>
                      <Input placeholder="연계 견적/입찰번호를 입력하세요" {...field} />
                    </FormControl>
                    <FormMessage />
                  </FormItem>
                )}
              />

              {/* 연계 PO번호 */}
              <FormField
                control={form.control}
                name="linkedPoNumber"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>연계 PO번호</FormLabel>
                    <FormControl>
                      <Input placeholder="연계 PO번호를 입력하세요" {...field} />
                    </FormControl>
                    <FormMessage />
                  </FormItem>
                )}
              />

              {/* 연계 BID번호 */}
              <FormField
                control={form.control}
                name="linkedBidNumber"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>연계 BID번호</FormLabel>
                    <FormControl>
                      <Input placeholder="연계 BID번호를 입력하세요" {...field} />
                    </FormControl>
                    <FormMessage />
                  </FormItem>
                )}
              />

              {/* 비고 */}
              <FormField
                control={form.control}
                name="notes"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>비고</FormLabel>
                    <FormControl>
                      <Textarea
                        placeholder="비고를 입력하세요"
                        className="min-h-[100px]"
                        {...field}
                      />
                    </FormControl>
                    <FormMessage />
                  </FormItem>
                )}
              />
              </div>

              <SheetFooter className="flex-shrink-0 mt-6">
                <Button
                  type="button"
                  variant="outline"
                  onClick={() => onOpenChange(false)}
                  disabled={isSubmitting}
                >
                  취소
                </Button>
                <Button type="submit" disabled={isSubmitting}>
                  {isSubmitting ? "수정 중..." : "수정"}
                </Button>
              </SheetFooter>
            </form>
          </Form>
        </div>
      </SheetContent>
    </Sheet>
  )
}
