/**
 * PricingDetailClient - IntegratedDetailTemplate 기반 단가 상세/등록/수정
 *
 * 기존 PricingDetailClient를 IntegratedDetailTemplate으로 마이그레이션
 * - 12개 필드: 단가번호, 품목유형, 카테고리명, 품목명, 규격, 무게, 단위, 구분, 거래처, 판매단가, 상태, 비고
 * - 대부분 필드 readonly, 거래처/판매단가/상태/비고만 edit/create 모드에서 수정 가능
 */

'use client';

import { useState, useEffect, useCallback } from 'react';
import { useRouter } from 'next/navigation';
import { toast } from 'sonner';
import {
  IntegratedDetailTemplate,
  type DetailMode,
} from '@/components/templates/IntegratedDetailTemplate';
import { pricingDetailConfig } from './pricingDetailConfig';
import type { Pricing, PricingFormData } from './types';
import { getPricingDetail, createPricing, updatePricing, deletePricing } from './actions';

interface PricingDetailClientProps {
  pricingId?: string;
  initialMode?: DetailMode;
}

export default function PricingDetailClient({
  pricingId,
  initialMode = 'view',
}: PricingDetailClientProps) {
  const router = useRouter();
  const [pricing, setPricing] = useState<Pricing | undefined>(undefined);
  const [isLoading, setIsLoading] = useState(false);
  const [mode, setMode] = useState<DetailMode>(initialMode);

  // 데이터 로드
  useEffect(() => {
    if (pricingId && initialMode !== 'create') {
      const loadData = async () => {
        setIsLoading(true);
        try {
          const result = await getPricingDetail(pricingId);
          if (result.success && result.data) {
            setPricing(result.data);
          } else {
            toast.error(result.error || '단가 정보를 불러오는데 실패했습니다.');
            router.push('/ko/construction/order/base-info/pricing');
          }
        } catch {
          toast.error('단가 정보를 불러오는데 실패했습니다.');
          router.push('/ko/construction/order/base-info/pricing');
        } finally {
          setIsLoading(false);
        }
      };
      loadData();
    }
  }, [pricingId, initialMode, router]);

  // 저장 핸들러
  const handleSubmit = useCallback(
    async (formData: Record<string, unknown>) => {
      try {
        const submitData = pricingDetailConfig.transformSubmitData!(formData) as unknown as PricingFormData;

        if (mode === 'create') {
          const result = await createPricing(submitData);
          if (result.success && result.data) {
            return { success: true };
          }
          return { success: false, error: result.error || '단가 등록에 실패했습니다.' };
        } else if (mode === 'edit' && pricingId) {
          // edit 모드에서는 수정 가능한 필드만 전송
          const result = await updatePricing(pricingId, {
            vendor: submitData.vendor,
            sellingPrice: submitData.sellingPrice,
            status: submitData.status,
          });
          if (result.success) {
            return { success: true };
          }
          return { success: false, error: result.error || '단가 수정에 실패했습니다.' };
        }

        return { success: false, error: '알 수 없는 오류가 발생했습니다.' };
      } catch {
        return { success: false, error: '저장 중 오류가 발생했습니다.' };
      }
    },
    [mode, pricingId]
  );

  // 삭제 핸들러
  const handleDelete = useCallback(async (id: string | number) => {
    try {
      const result = await deletePricing(String(id));
      if (result.success) {
        return { success: true };
      }
      return { success: false, error: result.error || '단가 삭제에 실패했습니다.' };
    } catch {
      return { success: false, error: '삭제 중 오류가 발생했습니다.' };
    }
  }, []);

  // 모드 변경 핸들러
  const handleModeChange = useCallback(
    (newMode: DetailMode) => {
      if (newMode === 'edit' && pricingId) {
        // edit 모드로 변경 시 별도 페이지로 이동 (기존 라우트 구조 유지)
        router.push(`/ko/construction/order/base-info/pricing/${pricingId}?mode=edit`);
      } else {
        setMode(newMode);
      }
    },
    [pricingId, router]
  );

  return (
    <IntegratedDetailTemplate
      config={pricingDetailConfig as Parameters<typeof IntegratedDetailTemplate>[0]['config']}
      mode={mode}
      initialData={pricing as Record<string, unknown> | undefined}
      itemId={pricingId}
      isLoading={isLoading}
      onSubmit={handleSubmit}
      onDelete={handleDelete}
      onModeChange={handleModeChange}
    />
  );
}

// Named export for backwards compatibility
export { PricingDetailClient };
