/**
 * Attribute Service
 * 속성(단위/재질/표면처리 등) 관련 도메인 로직 중앙화
 * - validation
 * - option management
 * - column management
 * - defaults
 */

import type { MasterOption, OptionColumn } from '../types';

// ===== Types =====

export type AttributeType = 'unit' | 'material' | 'surface' | string;
export type ColumnType = 'text' | 'number';

export interface OptionFormData {
  value: string;
  label: string;
  inputType: 'textbox' | 'dropdown' | 'checkbox' | 'number' | 'date' | 'textarea';
  required: boolean;
  options: string;
  placeholder: string;
  defaultValue: string;
  columnValues: Record<string, string>;
}

export interface ColumnFormData {
  name: string;
  key: string;
  type: ColumnType;
  required: boolean;
}

export interface OptionValidationResult {
  valid: boolean;
  errors: {
    value?: string;
    label?: string;
    options?: string;
    columnValues?: Record<string, string>;
  };
}

export interface ColumnValidationResult {
  valid: boolean;
  errors: {
    name?: string;
    key?: string;
  };
}

// ===== Service =====

export const attributeService = {
  // ===== Option Validation =====

  /**
   * 옵션 폼 유효성 검사
   */
  validateOption: (data: Partial<OptionFormData>, columns?: OptionColumn[]): OptionValidationResult => {
    const errors: OptionValidationResult['errors'] = {};

    if (!data.value || !data.value.trim()) {
      errors.value = '값을 입력해주세요';
    }

    if (!data.label || !data.label.trim()) {
      errors.label = '표시명을 입력해주세요';
    }

    // 드롭다운일 경우 옵션 필수
    if (data.inputType === 'dropdown' && (!data.options || !data.options.trim())) {
      errors.options = '드롭다운 옵션을 입력해주세요';
    }

    // 필수 칼럼 값 체크
    if (columns && data.columnValues) {
      const columnErrors: Record<string, string> = {};
      for (const column of columns) {
        if (column.required && !data.columnValues[column.key]?.trim()) {
          columnErrors[column.key] = `${column.name}은(는) 필수 입력 항목입니다`;
        }
      }
      if (Object.keys(columnErrors).length > 0) {
        errors.columnValues = columnErrors;
      }
    }

    return {
      valid: Object.keys(errors).length === 0,
      errors,
    };
  },

  /**
   * 옵션 값 유효성 검사
   */
  validateOptionValue: (value: string): { valid: boolean; error?: string } => {
    if (!value || !value.trim()) {
      return { valid: false, error: '값을 입력해주세요' };
    }
    return { valid: true };
  },

  /**
   * 옵션 표시명 유효성 검사
   */
  validateOptionLabel: (label: string): { valid: boolean; error?: string } => {
    if (!label || !label.trim()) {
      return { valid: false, error: '표시명을 입력해주세요' };
    }
    return { valid: true };
  },

  // ===== Column Validation =====

  /**
   * 칼럼 폼 유효성 검사
   */
  validateColumn: (data: Partial<ColumnFormData>): ColumnValidationResult => {
    const errors: ColumnValidationResult['errors'] = {};

    if (!data.name || !data.name.trim()) {
      errors.name = '칼럼명을 입력해주세요';
    }

    if (!data.key || !data.key.trim()) {
      errors.key = '칼럼 키를 입력해주세요';
    }

    return {
      valid: Object.keys(errors).length === 0,
      errors,
    };
  },

  // ===== Transform =====

  /**
   * 폼 데이터 → MasterOption 변환
   */
  toMasterOption: (formData: OptionFormData, attributeType: string): MasterOption => {
    return {
      id: `${attributeType}-${Date.now()}`,
      value: formData.value,
      label: formData.label,
      isActive: true,
      inputType: formData.inputType,
      required: formData.required,
      options: formData.inputType === 'dropdown'
        ? formData.options.split(',').map(o => o.trim()).filter(o => o)
        : undefined,
      placeholder: formData.placeholder || undefined,
      defaultValue: formData.defaultValue || undefined,
      columnValues: Object.keys(formData.columnValues).length > 0
        ? { ...formData.columnValues }
        : undefined,
    };
  },

  /**
   * 폼 데이터 → OptionColumn 변환
   */
  toOptionColumn: (formData: ColumnFormData): OptionColumn => {
    return {
      id: `col-${Date.now()}`,
      key: formData.key,
      name: formData.name,
      type: formData.type,
      required: formData.required,
    };
  },

  /**
   * 옵션 배열에서 라벨 목록 추출
   */
  extractLabels: (options: MasterOption[]): string[] => {
    return options.map(opt => opt.label);
  },

  /**
   * 옵션 배열에서 값 목록 추출
   */
  extractValues: (options: MasterOption[]): string[] => {
    return options.map(opt => opt.value);
  },

  // ===== Defaults =====

  /**
   * 새 옵션 생성 시 기본값
   */
  getDefaultOptionFormData: (): OptionFormData => ({
    value: '',
    label: '',
    inputType: 'textbox',
    required: false,
    options: '',
    placeholder: '',
    defaultValue: '',
    columnValues: {},
  }),

  /**
   * 새 칼럼 생성 시 기본값
   */
  getDefaultColumnFormData: (): ColumnFormData => ({
    name: '',
    key: '',
    type: 'text',
    required: false,
  }),

  /**
   * 기본 단위 옵션 목록
   */
  defaultUnitOptions: [
    { id: 'unit-1', value: 'EA', label: 'EA (개)', isActive: true },
    { id: 'unit-2', value: 'KG', label: 'KG (킬로그램)', isActive: true },
    { id: 'unit-3', value: 'M', label: 'M (미터)', isActive: true },
    { id: 'unit-4', value: 'MM', label: 'MM (밀리미터)', isActive: true },
    { id: 'unit-5', value: 'L', label: 'L (리터)', isActive: true },
    { id: 'unit-6', value: 'SET', label: 'SET (세트)', isActive: true },
    { id: 'unit-7', value: 'BOX', label: 'BOX (박스)', isActive: true },
    { id: 'unit-8', value: 'ROLL', label: 'ROLL (롤)', isActive: true },
  ] as MasterOption[],

  /**
   * 기본 재질 옵션 목록
   */
  defaultMaterialOptions: [
    { id: 'mat-1', value: 'SUS304', label: 'SUS304 (스테인리스)', isActive: true },
    { id: 'mat-2', value: 'SUS316', label: 'SUS316 (스테인리스)', isActive: true },
    { id: 'mat-3', value: 'AL6061', label: 'AL6061 (알루미늄)', isActive: true },
    { id: 'mat-4', value: 'AL5052', label: 'AL5052 (알루미늄)', isActive: true },
    { id: 'mat-5', value: 'SS400', label: 'SS400 (일반강)', isActive: true },
    { id: 'mat-6', value: 'S45C', label: 'S45C (탄소강)', isActive: true },
    { id: 'mat-7', value: 'POM', label: 'POM (폴리아세탈)', isActive: true },
    { id: 'mat-8', value: 'PEEK', label: 'PEEK (폴리에테르에테르케톤)', isActive: true },
  ] as MasterOption[],

  /**
   * 기본 표면처리 옵션 목록
   */
  defaultSurfaceTreatmentOptions: [
    { id: 'surf-1', value: 'NONE', label: '없음', isActive: true },
    { id: 'surf-2', value: 'ANODIZE', label: '아노다이징', isActive: true },
    { id: 'surf-3', value: 'PLATING', label: '도금', isActive: true },
    { id: 'surf-4', value: 'PAINTING', label: '도장', isActive: true },
    { id: 'surf-5', value: 'PASSIVATION', label: '부동태처리', isActive: true },
    { id: 'surf-6', value: 'SANDBLAST', label: '샌드블라스트', isActive: true },
    { id: 'surf-7', value: 'POLISHING', label: '폴리싱', isActive: true },
  ] as MasterOption[],

  /**
   * 속성 타입 목록
   */
  attributeTypes: [
    { value: 'unit', label: '단위' },
    { value: 'material', label: '재질' },
    { value: 'surface', label: '표면처리' },
  ] as const,

  /**
   * 칼럼 타입 목록
   */
  columnTypes: [
    { value: 'text', label: '텍스트' },
    { value: 'number', label: '숫자' },
  ] as const,
};
