import { z } from "zod";

/**
 * 공통코드 관련 Zod 스키마 정의
 */

// 카테고리 스키마
export const categorySchema = z.object({
  categoryCode: z
    .string()
    .min(1, "카테고리 코드는 필수입니다")
    .max(50, "카테고리 코드는 50자 이하여야 합니다")
    .regex(/^[A-Z0-9_]+$/, "대문자, 숫자, 언더스코어(_)만 사용 가능합니다"),
  categoryName: z.string().min(1, "카테고리명은 필수입니다").max(100, "카테고리명은 100자 이하여야 합니다"),
  categoryNameEng: z
    .string()
    .min(1, "영문 카테고리명은 필수입니다")
    .max(100, "영문 카테고리명은 100자 이하여야 합니다"),
  description: z.string().min(1, "설명은 필수입니다").max(500, "설명은 500자 이하여야 합니다"),
  sortOrder: z.number().min(1, "정렬 순서는 1 이상이어야 합니다").max(9999, "정렬 순서는 9999 이하여야 합니다"),
});

// 카테고리 생성 스키마
export const createCategorySchema = categorySchema;

// 카테고리 수정 스키마 (카테고리 코드 제외)
export const updateCategorySchema = categorySchema.omit({ categoryCode: true }).extend({
  isActive: z.enum(["Y", "N"]),
});

// 코드 스키마
export const codeSchema = z.object({
  codeValue: z.string().min(1, "코드값은 필수입니다").max(50, "코드값은 50자 이하여야 합니다"),
  codeName: z.string().min(1, "코드명은 필수입니다").max(100, "코드명은 100자 이하여야 합니다"),
  codeNameEng: z.string().max(100, "영문 코드명은 100자 이하여야 합니다").optional().or(z.literal("")),
  description: z.string().max(500, "설명은 500자 이하여야 합니다").optional().or(z.literal("")),
  sortOrder: z.number().min(1, "정렬 순서는 1 이상이어야 합니다").max(9999, "정렬 순서는 9999 이하여야 합니다"),
  parentCodeValue: z.string().optional().nullable(), // 계층구조: 부모 코드값 (선택)
});

// 코드 생성 스키마
export const createCodeSchema = codeSchema;

// 코드 수정 스키마 (코드값 제외)
export const updateCodeSchema = codeSchema.omit({ codeValue: true }).extend({
  isActive: z.enum(["Y", "N"]),
});

// TypeScript 타입 추론
export type CategoryFormData = z.infer<typeof categorySchema>;
export type CreateCategoryData = z.infer<typeof createCategorySchema>;
export type UpdateCategoryData = z.infer<typeof updateCategorySchema>;

export type CodeFormData = z.infer<typeof codeSchema>;
export type CreateCodeData = z.infer<typeof createCodeSchema>;
export type UpdateCodeData = z.infer<typeof updateCodeSchema>;

// 검색 필터 스키마
export const categoryFilterSchema = z.object({
  search: z.string().optional(),
  active: z.boolean().optional(),
});

export const codeFilterSchema = z.object({
  search: z.string().optional(),
  active: z.boolean().optional(),
});

export type CategoryFilter = z.infer<typeof categoryFilterSchema>;
export type CodeFilter = z.infer<typeof codeFilterSchema>;
