/**
 * 폼 데이터 Zod 검증 스키마
 *
 * 품목 생성/수정/필터용 스키마
 */

import { z } from 'zod';
import { itemTypeSchema } from './common';
import {
  productSchema,
  productSchemaBase,
  partSchemaBase,
  materialSchemaBase,
  consumableSchemaBase,
} from './item-schemas';

// ===== 폼 데이터 스키마 (생성/수정용) =====

/**
 * 품목 생성 폼 스키마
 * (id, createdAt, updatedAt 제외)
 *
 * discriminatedUnion은 omit()을 지원하지 않으므로,
 * 각 스키마에 대해 개별적으로 omit을 적용합니다.
 */
// partSchemaBase를 omit한 후 itemType merge - refinement는 마지막에 적용
const partSchemaForForm = partSchemaBase
  .omit({ createdAt: true, updatedAt: true })
  .merge(z.object({ itemType: z.literal('PT') }))
  .superRefine((data, ctx) => {
    // 1단계: 부품 유형 필수
    if (!data.partType || data.partType === '') {
      ctx.addIssue({
        code: z.ZodIssueCode.custom,
        message: '부품 유형을 선택해주세요',
        path: ['partType'],
      });
      return; // 부품 유형이 없으면 더 이상 검증하지 않음
    }

    // 2단계: 부품 유형이 있을 때만 품목명 필수
    if (!data.category1 || data.category1 === '') {
      ctx.addIssue({
        code: z.ZodIssueCode.custom,
        message: '품목명을 선택해주세요',
        path: ['category1'],
      });
      return; // 품목명이 없으면 더 이상 검증하지 않음 (설치유형 등 체크 안 함)
    }

    // 3단계: 조립 부품 전용 필드 (partType과 category1이 모두 있을 때만 실행됨)
    if (data.partType === 'ASSEMBLY') {
      if (!data.installationType) {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          message: '설치 유형을 선택해주세요',
          path: ['installationType'],
        });
      }
      if (!data.sideSpecWidth) {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          message: '측면 규격 (가로)를 입력해주세요',
          path: ['sideSpecWidth'],
        });
      }
      if (!data.sideSpecHeight) {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          message: '측면 규격 (세로)를 입력해주세요',
          path: ['sideSpecHeight'],
        });
      }
      if (!data.assemblyLength) {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          message: '길이를 선택해주세요',
          path: ['assemblyLength'],
        });
      }
    }

    // 절곡품 전용 필드 (partType과 category1이 모두 있을 때만 실행됨)
    if (data.partType === 'BENDING') {
      // 단계별 검증: 종류(category2) → 재질(material) → 폭 합계 → 모양&길이
      if (!data.category2 || data.category2 === '') {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          message: '종류를 선택해주세요',
          path: ['category2'],
        });
        return; // 종류가 없으면 재질, 폭 합계, 모양&길이 체크 안 함
      }
      if (!data.material) {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          message: '재질을 선택해주세요',
          path: ['material'],
        });
        return; // 재질이 없으면 폭 합계, 모양&길이 체크 안 함
      }
      if (!data.length) {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          message: '폭 합계를 입력해주세요',
          path: ['length'],
        });
        return; // 폭 합계가 없으면 모양&길이 체크 안 함
      }
      if (!data.bendingLength) {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          message: '모양&길이를 선택해주세요',
          path: ['bendingLength'],
        });
      }
    }

    // 구매 부품 전용 필드 (partType과 category1이 모두 있을 때만 실행됨)
    if (data.partType === 'PURCHASED') {
      if (data.category1 === 'electric_opener') {
        if (!data.electricOpenerPower) {
          ctx.addIssue({
            code: z.ZodIssueCode.custom,
            message: '전원을 선택해주세요',
            path: ['electricOpenerPower'],
          });
        }
        if (!data.electricOpenerCapacity) {
          ctx.addIssue({
            code: z.ZodIssueCode.custom,
            message: '용량을 선택해주세요',
            path: ['electricOpenerCapacity'],
          });
        }
      }
      if (data.category1 === 'motor' && !data.motorVoltage) {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          message: '전압을 선택해주세요',
          path: ['motorVoltage'],
        });
      }
      if (data.category1 === 'chain' && !data.chainSpec) {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          message: '체인 규격을 선택해주세요',
          path: ['chainSpec'],
        });
      }
    }
  });

export const createItemFormSchema = z.discriminatedUnion('itemType', [
  productSchema.omit({ createdAt: true, updatedAt: true }).extend({ itemType: z.literal('FG') }),
  partSchemaForForm, // itemType이 이미 merge되어 있음
  materialSchemaBase.omit({ createdAt: true, updatedAt: true }).extend({ itemType: z.literal('SM') }),
  materialSchemaBase.omit({ createdAt: true, updatedAt: true }).extend({ itemType: z.literal('RM') }),
  consumableSchemaBase.omit({ createdAt: true, updatedAt: true }).extend({ itemType: z.literal('CS') }),
]);

/**
 * 품목 수정 폼 스키마
 * (모든 필드 선택적)
 *
 * discriminatedUnion은 partial()도 지원하지 않으므로,
 * 각 스키마에 대해 개별적으로 처리합니다.
 */
export const updateItemFormSchema = z.discriminatedUnion('itemType', [
  productSchemaBase.omit({ createdAt: true, updatedAt: true }).partial().extend({ itemType: z.literal('FG') }),
  partSchemaBase.omit({ createdAt: true, updatedAt: true }).partial().extend({ itemType: z.literal('PT') }),
  materialSchemaBase.omit({ createdAt: true, updatedAt: true }).partial().extend({ itemType: z.literal('SM') }),
  materialSchemaBase.omit({ createdAt: true, updatedAt: true }).partial().extend({ itemType: z.literal('RM') }),
  consumableSchemaBase.omit({ createdAt: true, updatedAt: true }).partial().extend({ itemType: z.literal('CS') }),
]);

// ===== 필터 스키마 =====

/**
 * 품목 목록 필터 스키마
 */
export const itemFilterSchema = z.object({
  itemType: itemTypeSchema.optional(),
  search: z.string().optional(),
  category1: z.string().optional(),
  category2: z.string().optional(),
  category3: z.string().optional(),
  isActive: z.boolean().optional(),
});
