/**
 * 공용 룩업(셀렉트 옵션) 조회 헬퍼
 *
 * 여러 도메인(입금/출금/매입/예상비용)에서 동일하게 사용하는
 * 거래처/계좌 조회 로직을 하나로 통합합니다.
 *
 * 주의: 이 파일은 'use server'가 아닙니다.
 * 각 도메인의 actions.ts ('use server')에서 import하여 사용합니다.
 */

import { executeServerAction, type ActionResult } from './execute-server-action';
import type { SelectOption } from './types';

// ===== 계좌 상세 옵션 =====
export interface BankAccountOption {
  id: string;
  bankName: string;
  accountName: string;
  accountNumber: string;
}

// ===== API 내부 타입 =====
interface ClientApiItem {
  id: number;
  name: string;
}

interface BankAccountApiItem {
  id: number;
  bank_name: string;
  account_name: string;
  account_number: string;
}

type PaginatedOrArray<T> = { data?: T[] } | T[];

function extractArray<T>(data: PaginatedOrArray<T>): T[] {
  return Array.isArray(data) ? data : (data as { data?: T[] })?.data || [];
}

// ===== 거래처 목록 조회 =====
export async function fetchVendorOptions(): Promise<ActionResult<SelectOption[]>> {
  const API_URL = process.env.NEXT_PUBLIC_API_URL;
  const result = await executeServerAction({
    url: `${API_URL}/api/v1/clients?size=1000`,
    transform: (data: PaginatedOrArray<ClientApiItem>) => {
      const clients = extractArray(data);
      return clients.map(c => ({ id: String(c.id), name: c.name }));
    },
    errorMessage: '거래처 조회에 실패했습니다.',
  });
  return { success: result.success, data: result.data || [], error: result.error };
}

// ===== 계좌 목록 조회 (간단: id + name) =====
export async function fetchBankAccountOptions(): Promise<ActionResult<SelectOption[]>> {
  const API_URL = process.env.NEXT_PUBLIC_API_URL;
  const result = await executeServerAction({
    url: `${API_URL}/api/v1/bank-accounts?per_page=100`,
    transform: (data: PaginatedOrArray<BankAccountApiItem>) => {
      const accounts = extractArray(data);
      return accounts.map(a => ({ id: String(a.id), name: `${a.bank_name} ${a.account_name}` }));
    },
    errorMessage: '계좌 조회에 실패했습니다.',
  });
  return { success: result.success, data: result.data || [], error: result.error };
}

// ===== 계좌 목록 조회 (상세: bankName, accountName, accountNumber) =====
export async function fetchBankAccountDetailOptions(): Promise<ActionResult<BankAccountOption[]>> {
  const API_URL = process.env.NEXT_PUBLIC_API_URL;
  const result = await executeServerAction({
    url: `${API_URL}/api/v1/bank-accounts?per_page=100`,
    transform: (data: PaginatedOrArray<BankAccountApiItem>) => {
      const accounts = extractArray(data);
      return accounts.map(a => ({
        id: String(a.id),
        bankName: a.bank_name,
        accountName: a.account_name,
        accountNumber: a.account_number,
      }));
    },
    errorMessage: '은행 계좌 조회에 실패했습니다.',
  });
  return { success: result.success, data: result.data || [], error: result.error };
}
