'use server';

import type { Category } from './types';
import { apiClient } from '@/lib/api';

/**
 * 주일 기업 - 카테고리 관리 Server Actions
 * 표준화된 apiClient 사용 버전
 */

// ========================================
// API 응답 타입
// ========================================

interface ApiCategory {
  id: number;
  name: string;
  sort_order: number;
  is_default: boolean;
  is_active: boolean;
  created_at: string;
  updated_at: string;
}

// ========================================
// 타입 변환 함수
// ========================================

/**
 * API 응답 → Category 타입 변환
 */
function transformCategory(apiData: ApiCategory): Category {
  return {
    id: String(apiData.id),
    name: apiData.name || '',
    order: apiData.sort_order || 0,
    isDefault: apiData.is_default || false,
    isActive: apiData.is_active !== false,
    createdAt: apiData.created_at || '',
    updatedAt: apiData.updated_at || '',
  };
}

// ========================================
// API 함수
// ========================================

/**
 * 카테고리 목록 조회
 * GET /api/v1/categories
 */
export async function getCategories(): Promise<{
  success: boolean;
  data?: Category[];
  error?: string;
}> {
  try {
    const response = await apiClient.get<{
      data: ApiCategory[];
    }>('/categories', { params: { per_page: '100' } });

    const rawData = Array.isArray(response.data) ? response.data : (response.data as unknown as { data: ApiCategory[] })?.data || [];
    const categories = rawData
      .map(transformCategory)
      .sort((a, b) => a.order - b.order);

    return { success: true, data: categories };
  } catch (error) {
    console.error('카테고리 목록 조회 오류:', error);
    return { success: false, error: '카테고리 목록을 불러오는데 실패했습니다.' };
  }
}

/**
 * 카테고리 생성
 * POST /api/v1/categories
 */
export async function createCategory(data: {
  name: string;
}): Promise<{
  success: boolean;
  data?: Category;
  error?: string;
}> {
  try {
    const response = await apiClient.post<ApiCategory>('/categories', {
      name: data.name,
    });
    return { success: true, data: transformCategory(response) };
  } catch (error) {
    console.error('카테고리 생성 오류:', error);
    return { success: false, error: '카테고리 생성에 실패했습니다.' };
  }
}

/**
 * 카테고리 수정
 * PATCH /api/v1/categories/{id}
 */
export async function updateCategory(
  id: string,
  data: { name?: string }
): Promise<{
  success: boolean;
  data?: Category;
  error?: string;
}> {
  try {
    const response = await apiClient.patch<ApiCategory>(`/categories/${id}`, {
      name: data.name,
    });
    return { success: true, data: transformCategory(response) };
  } catch (error) {
    console.error('카테고리 수정 오류:', error);
    return { success: false, error: '카테고리 수정에 실패했습니다.' };
  }
}

/**
 * 카테고리 삭제
 * DELETE /api/v1/categories/{id}
 */
export async function deleteCategory(id: string): Promise<{
  success: boolean;
  error?: string;
  errorType?: 'IN_USE' | 'DEFAULT' | 'GENERAL';
}> {
  try {
    await apiClient.delete(`/categories/${id}`);
    return { success: true };
  } catch (error: unknown) {
    console.error('카테고리 삭제 오류:', error);

    // API 에러 응답에서 errorType 추출
    const apiError = error as { response?: { data?: { error_type?: string; message?: string } } };
    const errorType = apiError?.response?.data?.error_type;
    const errorMessage = apiError?.response?.data?.message;

    if (errorType === 'IN_USE') {
      return {
        success: false,
        error: errorMessage || '해당 카테고리를 사용하고 있는 품목이 있습니다.',
        errorType: 'IN_USE',
      };
    }

    if (errorType === 'DEFAULT') {
      return {
        success: false,
        error: errorMessage || '기본 카테고리는 삭제가 불가합니다.',
        errorType: 'DEFAULT',
      };
    }

    return {
      success: false,
      error: '카테고리 삭제에 실패했습니다.',
      errorType: 'GENERAL',
    };
  }
}

/**
 * 카테고리 순서 변경
 * POST /api/v1/categories/reorder
 */
export async function reorderCategories(
  items: { id: string; sort_order: number }[]
): Promise<{
  success: boolean;
  error?: string;
}> {
  try {
    await apiClient.post('/categories/reorder', {
      items: items.map((item) => ({
        id: Number(item.id),
        sort_order: item.sort_order,
      })),
    });
    return { success: true };
  } catch (error) {
    console.error('카테고리 순서 변경 오류:', error);
    return { success: false, error: '순서 변경에 실패했습니다.' };
  }
}