"use client"

import * as React from "react"
import { zodResolver } from "@hookform/resolvers/zod"
import { useForm } from "react-hook-form"
import { useSession } from "next-auth/react"

import { Button } from "@/components/ui/button"
import {
  Form,
  FormControl,
  FormField,
  FormItem,
  FormLabel,
  FormMessage,
} from "@/components/ui/form"
import { Input } from "@/components/ui/input"
import { toast } from "@/hooks/use-toast"
import { Download, Loader2, Mail, Phone, User } from "lucide-react"
import { Badge } from "@/components/ui/badge"

// 기술영업 벤더 관련 임포트
import { getTechVendorDetailById, modifyTechVendor } from "@/lib/tech-vendors/service"
import { updateTechVendorSchema, type UpdateTechVendorSchema } from "@/lib/tech-vendors/validations"

import {
  Card,
  CardContent,
  CardDescription,
  CardHeader,
  CardTitle,
} from "@/components/ui/card"
import { InformationButton } from "@/components/information/information-button"

// 보안 파일 다운로드 유틸리티 import
import { 
  downloadFile, 
  quickDownload, 
  smartFileAction, 
  getFileInfo, 
  formatFileSize,
  getSecurityInfo 
} from "@/lib/file-download"

// 타입 정의
interface TechVendorContact {
  id: number
  contactName: string
  contactPosition: string | null
  contactEmail: string
  contactPhone: string | null
  isPrimary: boolean
}

interface TechVendorAttachment {
  id: number
  fileName: string
  filePath: string
  attachmentType: string
  fileSize?: number
  createdAt: Date
  updatedAt: Date
}

export function TechVendorInfoForm() {
  const { data: session } = useSession()
  const techCompanyId = session?.user?.techCompanyId

  // 기술영업 벤더 데이터 상태
  const [vendor, setVendor] = React.useState<any>(null)
  const [contacts, setContacts] = React.useState<TechVendorContact[]>([])
  const [attachments, setAttachments] = React.useState<TechVendorAttachment[]>([])
  const [isLoading, setIsLoading] = React.useState(true)
  const [isSubmitting, setIsSubmitting] = React.useState(false)
  const [isDownloading, setIsDownloading] = React.useState(false)

  // React Hook Form (기술영업 벤더용 스키마 사용)
  const form = useForm<UpdateTechVendorSchema>({
    resolver: zodResolver(updateTechVendorSchema),
    defaultValues: {
      vendorName: "",
      vendorCode: "",
      address: "",
      email: "",
      phone: "",
      country: "",
      website: "",
      techVendorType: "",
      status: "ACTIVE",
    },
    mode: "onChange",
  })

  const isFormValid = form.formState.isValid

  // 기술영업 벤더 정보 가져오기
  React.useEffect(() => {
    async function fetchTechVendorData() {
      if (!techCompanyId) return

      try {
        setIsLoading(true)
        // 기술영업 벤더 상세 정보 가져오기 (연락처, 첨부파일 포함)
        const vendorData = await getTechVendorDetailById(Number(techCompanyId))

        if (!vendorData) {
          toast({
            variant: "destructive",
            title: "오류",
            description: "기술영업 벤더 정보를 찾을 수 없습니다.",
          })
          return
        }

        setVendor(vendorData)
        setContacts(vendorData.contacts || [])
        setAttachments(vendorData.attachments || [])

        // 폼 기본값 설정
        const formValues = {
          vendorName: vendorData.vendorName || "",
          vendorCode: vendorData.vendorCode || "",
          address: vendorData.address || "",
          email: vendorData.email || "",
          phone: vendorData.phone || "",
          country: vendorData.country || "",
          website: vendorData.website || "",
          techVendorType: vendorData.techVendorType || "",
          status: vendorData.status || "ACTIVE",
        }

        form.reset(formValues)
      } catch (error) {
        console.error("Error fetching tech vendor data:", error)
        toast({
          variant: "destructive",
          title: "데이터 로드 오류",
          description: "기술영업 벤더 정보를 불러오는 중 오류가 발생했습니다.",
        })
      } finally {
        setIsLoading(false)
      }
    }

    fetchTechVendorData()
  }, [techCompanyId, form])

  // 보안 다운로드 유틸리티를 사용한 개별 파일 다운로드
  const handleDownloadFile = async (file: TechVendorAttachment) => {
    try {
      setIsDownloading(true)
      
      // API 엔드포인트 URL 구성
      const downloadUrl = `/api/tech-vendors/attachments/download?id=${file.id}&vendorId=${Number(techCompanyId)}`
      
      // 보안 다운로드 유틸리티 사용
      const result = await downloadFile(downloadUrl, file.fileName, {
        action: 'download',
        showToast: false, // 우리가 직접 토스트 관리
        onSuccess: (fileName, fileSize) => {
          const sizeText = fileSize ? ` (${formatFileSize(fileSize)})` : '';
          toast({
            title: "다운로드 완료",
            description: `파일 다운로드가 완료되었습니다: ${fileName}${sizeText}`,
          });
        },
        onError: (error) => {
          console.error("Download error:", error);
          toast({
            variant: "destructive",
            title: "다운로드 오류",
            description: error || "파일 다운로드 중 오류가 발생했습니다.",
          });
        }
      });

      if (!result.success && result.error) {
        // 오류 처리는 onError 콜백에서 이미 처리됨
        console.error("Download failed:", result.error);
      }
      
    } catch (error) {
      console.error("Error downloading file:", error);
      toast({
        variant: "destructive",
        title: "다운로드 오류",
        description: "파일 다운로드 중 예상치 못한 오류가 발생했습니다.",
      });
    } finally {
      setIsDownloading(false);
    }
  }

  // 보안 다운로드 유틸리티를 사용한 전체 파일 다운로드
  const handleDownloadAllFiles = async () => {
    try {
      setIsDownloading(true)

      // 전체 파일 다운로드 API 엔드포인트
      const downloadUrl = `/api/tech-vendors/attachments/download-all?vendorId=${Number(techCompanyId)}`
      const fileName = `tech-vendor-${techCompanyId}-files.zip`
      
      // 보안 다운로드 유틸리티 사용
      const result = await downloadFile(downloadUrl, fileName, {
        action: 'download',
        showToast: false, // 우리가 직접 토스트 관리
        onSuccess: (fileName, fileSize) => {
          const sizeText = fileSize ? ` (${formatFileSize(fileSize)})` : '';
          toast({
            title: "전체 다운로드 완료",
            description: `전체 파일 다운로드가 완료되었습니다: ${fileName}${sizeText}`,
          });
        },
        onError: (error) => {
          console.error("Download all error:", error);
          toast({
            variant: "destructive",
            title: "다운로드 오류",
            description: error || "전체 파일 다운로드 중 오류가 발생했습니다.",
          });
        }
      });

      if (!result.success && result.error) {
        // 오류 처리는 onError 콜백에서 이미 처리됨
        console.error("Download all failed:", result.error);
      }
      
    } catch (error) {
      console.error("Error downloading files:", error);
      toast({
        variant: "destructive",
        title: "다운로드 오류",
        description: "전체 파일 다운로드 중 예상치 못한 오류가 발생했습니다.",
      });
    } finally {
      setIsDownloading(false);
    }
  }

  async function onSubmit(values: UpdateTechVendorSchema) {
    if (!techCompanyId) return
    
    setIsSubmitting(true)
    
    try {
      const { error } = await modifyTechVendor({
        ...values,
        id: String(techCompanyId),
      })

      if (error) {
        throw new Error(error)
      }

      toast({
        title: "업데이트 완료",
        description: "기술영업 벤더 정보가 성공적으로 업데이트되었습니다.",
      })
    } catch (error) {
      console.error("Error updating tech vendor:", error)
      toast({
        variant: "destructive",
        title: "업데이트 오류",
        description: "기술영업 벤더 정보 업데이트 중 오류가 발생했습니다.",
      })
    } finally {
      setIsSubmitting(false)
    }
  }

  if (isLoading) {
    return (
      <div className="flex items-center justify-center p-8">
        <Loader2 className="h-8 w-8 animate-spin" />
        <span className="ml-2">기술영업 벤더 정보를 불러오는 중...</span>
      </div>
    )
  }

  if (!vendor) {
    return (
      <div className="flex items-center justify-center p-8">
        <span>기술영업 벤더 정보를 찾을 수 없습니다.</span>
      </div>
    )
  }

  // 보안 정보 가져오기
  const securityInfo = getSecurityInfo();

  return (
    <div className="space-y-6 p-6">
      <div className="flex items-center justify-between">
        <div>
          <div className="flex items-center gap-2">
            <h2 className="text-2xl font-bold">기술영업 벤더 정보</h2>
            <InformationButton pagePath="partners/info" />
          </div>
          <p className="text-gray-600">기술영업 벤더 정보를 확인하고 업데이트할 수 있습니다.</p>
          
          {/* 보안 정보 표시 */}
          <div className="text-xs text-muted-foreground mt-1">
            <p>📁 허용 파일 크기: {securityInfo.maxFileSizeFormatted} | 남은 다운로드: {securityInfo.remainingDownloads}/분</p>
          </div>
        </div>
        {attachments.length > 0 && (
          <Button
            variant="outline"
            onClick={handleDownloadAllFiles}
            disabled={isDownloading}
          >
            {isDownloading ? (
              <Loader2 className="h-4 w-4 mr-2 animate-spin" />
            ) : (
              <Download className="h-4 w-4 mr-2" />
            )}
            {isDownloading ? "다운로드 중..." : "전체 파일 다운로드"}
          </Button>
        )}
      </div>

      <Form {...form}>
        <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6">
          <Card>
            <CardHeader>
              <CardTitle>기본 정보</CardTitle>
            </CardHeader>
            <CardContent className="space-y-4">
              <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
                <FormField
                  control={form.control}
                  name="vendorName"
                  render={({ field }) => (
                    <FormItem>
                      <FormLabel>벤더명</FormLabel>
                      <FormControl>
                        <Input {...field} disabled />
                      </FormControl>
                      <FormMessage />
                    </FormItem>
                  )}
                />
                <FormField
                  control={form.control}
                  name="vendorCode"
                  render={({ field }) => (
                    <FormItem>
                      <FormLabel>벤더 코드</FormLabel>
                      <FormControl>
                        <Input {...field} disabled />
                      </FormControl>
                      <FormMessage />
                    </FormItem>
                  )}
                />
              </div>

              {/* 사업자등록번호 */}
              {vendor.taxId && (
                <div>
                  <label className="text-sm font-medium text-gray-600">사업자등록번호</label>
                  <p className="mt-1">{vendor.taxId}</p>
                </div>
              )}

              {/* 공급품목 */}
              {vendor.items && (
                <div>
                  <label className="text-sm font-medium text-gray-600">공급품목</label>
                  <p className="mt-1 text-sm leading-relaxed">{vendor.items}</p>
                </div>
              )}

              <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
                <FormField
                  control={form.control}
                  name="email"
                  render={({ field }) => (
                    <FormItem>
                      <FormLabel>이메일</FormLabel>
                      <FormControl>
                        <Input {...field} type="email" />
                      </FormControl>
                      <FormMessage />
                    </FormItem>
                  )}
                />
                <FormField
                  control={form.control}
                  name="phone"
                  render={({ field }) => (
                    <FormItem>
                      <FormLabel>전화번호</FormLabel>
                      <FormControl>
                        <Input {...field} />
                      </FormControl>
                      <FormMessage />
                    </FormItem>
                  )}
                />
              </div>

              <FormField
                control={form.control}
                name="address"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>주소</FormLabel>
                    <FormControl>
                      <Input {...field} />
                    </FormControl>
                    <FormMessage />
                  </FormItem>
                )}
              />

              <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
                <FormField
                  control={form.control}
                  name="country"
                  render={({ field }) => (
                    <FormItem>
                      <FormLabel>국가</FormLabel>
                      <FormControl>
                        <Input {...field} />
                      </FormControl>
                      <FormMessage />
                    </FormItem>
                  )}
                />
                <FormField
                  control={form.control}
                  name="website"
                  render={({ field }) => (
                    <FormItem>
                      <FormLabel>웹사이트</FormLabel>
                      <FormControl>
                        <Input {...field} />
                      </FormControl>
                      <FormMessage />
                    </FormItem>
                  )}
                />
              </div>
            </CardContent>
          </Card>

          {/* 연락처 정보 */}
          {contacts.length > 0 && (
            <Card>
              <CardHeader>
                <CardTitle>연락처 정보</CardTitle>
                <CardDescription>
                  등록된 연락처 정보입니다.
                </CardDescription>
              </CardHeader>
              <CardContent>
                <div className="space-y-4">
                  {contacts.map((contact) => (
                    <div
                      key={contact.id}
                      className="flex items-center justify-between p-4 border rounded-lg"
                    >
                      <div className="flex items-center space-x-4">
                        <div className="flex h-10 w-10 items-center justify-center rounded-full bg-blue-100">
                          <User className="h-5 w-5 text-blue-600" />
                        </div>
                        <div>
                          <div className="flex items-center space-x-2">
                            <h4 className="font-medium">{contact.contactName}</h4>
                            {contact.isPrimary && (
                              <Badge variant="secondary">주 담당자</Badge>
                            )}
                          </div>
                          {contact.contactPosition && (
                            <p className="text-sm text-gray-600">{contact.contactPosition}</p>
                          )}
                        </div>
                      </div>
                      <div className="flex space-x-2">
                        {contact.contactEmail && (
                          <Button
                            variant="ghost"
                            size="sm"
                            onClick={() => window.open(`mailto:${contact.contactEmail}`)}
                          >
                            <Mail className="h-4 w-4" />
                          </Button>
                        )}
                        {contact.contactPhone && (
                          <Button
                            variant="ghost"
                            size="sm"
                            onClick={() => window.open(`tel:${contact.contactPhone}`)}
                          >
                            <Phone className="h-4 w-4" />
                          </Button>
                        )}
                      </div>
                    </div>
                  ))}
                </div>
              </CardContent>
            </Card>
          )}

          {/* 첨부파일 정보 - 보안 강화된 버전 */}
          {attachments.length > 0 && (
            <Card>
              <CardHeader>
                <CardTitle>첨부파일</CardTitle>
                <CardDescription>
                  업로드된 파일들을 확인하고 다운로드할 수 있습니다.
                </CardDescription>
              </CardHeader>
              <CardContent>
                <div className="space-y-2">
                  {attachments.map((file) => {
                    const fileInfo = getFileInfo(file.fileName);
                    return (
                      <div
                        key={file.id}
                        className="flex items-center justify-between p-3 border rounded-lg hover:bg-gray-50"
                      >
                        <div className="flex-1">
                          <div className="flex items-center space-x-2">
                            <span className="text-lg">{fileInfo.icon}</span>
                            <h4 className="font-medium">{file.fileName}</h4>
                          </div>
                          <div className="flex items-center space-x-2 text-sm text-gray-600 mt-1">
                            <span>{file.attachmentType}</span>
                            <span>•</span>
                            <span>{new Date(file.createdAt).toLocaleDateString()}</span>
                            {file.fileSize && (
                              <>
                                <span>•</span>
                                <span>{formatFileSize(file.fileSize)}</span>
                              </>
                            )}
                          </div>
                        </div>
                        <Button
                          variant="ghost"
                          size="sm"
                          onClick={() => handleDownloadFile(file)}
                          disabled={isDownloading}
                        >
                          {isDownloading ? (
                            <Loader2 className="h-4 w-4 animate-spin" />
                          ) : (
                            <Download className="h-4 w-4" />
                          )}
                        </Button>
                      </div>
                    );
                  })}
                </div>
              </CardContent>
            </Card>
          )}

          <div className="flex justify-end space-x-4">
            <Button
              type="submit"
              disabled={isSubmitting || !isFormValid}
            >
              {isSubmitting ? (
                <>
                  <Loader2 className="mr-2 h-4 w-4 animate-spin" />
                  업데이트 중...
                </>
              ) : (
                "정보 업데이트"
              )}
            </Button>
          </div>
        </form>
      </Form>
    </div>
  )
}