'use server';

/**
 * 일괄 작업 공통 액션
 *
 * 여러 모듈에서 공통으로 사용하는 일괄 작업 함수:
 * - 계정과목 일괄 변경 (출금/입금/매출)
 * - 엑셀 내보내기 (근태/급여)
 */

import { executeServerAction } from '@/lib/api/execute-server-action';
import { cookies } from 'next/headers';

const API_URL = process.env.NEXT_PUBLIC_API_URL;

// ============================================
// 계정과목 일괄 변경
// ============================================

export interface BulkUpdateAccountCodeResult {
  success: boolean;
  updatedCount?: number;
  error?: string;
  __authError?: boolean;
}

/**
 * 계정과목 일괄 변경 (범용)
 *
 * @param endpoint - API 엔드포인트 (예: '/api/v1/withdrawals/bulk-update-account-code')
 * @param ids - 변경할 레코드 ID 배열
 * @param accountCode - 새 계정과목 코드
 */
export async function bulkUpdateAccountCode(
  endpoint: string,
  ids: string[],
  accountCode: string
): Promise<BulkUpdateAccountCodeResult> {
  interface BulkUpdateData { updated_count?: number }
  const result = await executeServerAction<BulkUpdateData>({
    url: `${API_URL}${endpoint}`,
    method: 'PUT',
    body: {
      ids: ids.map((id) => parseInt(id, 10)),
      account_code: accountCode,
    },
    errorMessage: '계정과목 변경에 실패했습니다.',
  });

  if (!result.success) {
    return { success: false, error: result.error, __authError: result.__authError };
  }

  return {
    success: true,
    updatedCount: result.data?.updated_count || ids.length,
  };
}

// ============================================
// 엑셀 내보내기
// ============================================

export interface ExportResult {
  success: boolean;
  data?: Blob;
  filename?: string;
  error?: string;
  __authError?: boolean;
}

/**
 * 엑셀 내보내기 (범용)
 *
 * 서버에서 엑셀 파일을 생성하고 Blob으로 반환합니다.
 * 클라이언트에서 downloadBlob() 유틸리티로 다운로드 처리합니다.
 *
 * @param endpoint - API 엔드포인트 (예: '/api/v1/attendances/export')
 * @param params - 쿼리 파라미터 (선택)
 * @param filename - 다운로드 파일명 (선택)
 */
export async function exportToExcel(
  endpoint: string,
  params?: Record<string, string | number | boolean | undefined>,
  filename?: string
): Promise<ExportResult> {
  try {
    const cookieStore = await cookies();
    const token = cookieStore.get('access_token')?.value;

    if (!token) {
      return { success: false, __authError: true };
    }

    // 쿼리 파라미터 생성
    const searchParams = new URLSearchParams();
    if (params) {
      Object.entries(params).forEach(([key, value]) => {
        if (value !== undefined && value !== null && value !== '') {
          searchParams.set(key, String(value));
        }
      });
    }

    const queryString = searchParams.toString();
    const url = `${API_URL}${endpoint}${queryString ? `?${queryString}` : ''}`;

    const response = await fetch(url, {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${token}`,
        Accept: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        'X-API-KEY': process.env.API_KEY || '',
      },
      cache: 'no-store',
    });

    // 401 인증 에러
    if (response.status === 401) {
      return { success: false, __authError: true };
    }

    if (!response.ok) {
      // JSON 에러 응답인 경우
      const contentType = response.headers.get('content-type');
      if (contentType?.includes('application/json')) {
        const errorData = await response.json();
        return { success: false, error: errorData.message || '내보내기에 실패했습니다.' };
      }
      return { success: false, error: `내보내기 실패: ${response.status}` };
    }

    // Content-Disposition 헤더에서 파일명 추출
    const contentDisposition = response.headers.get('content-disposition');
    let extractedFilename = filename;
    if (contentDisposition) {
      const match = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);
      if (match && match[1]) {
        extractedFilename = match[1].replace(/['"]/g, '');
      }
    }

    const blob = await response.blob();

    return {
      success: true,
      data: blob,
      filename: extractedFilename,
    };
  } catch (err) {
    console.error('[BulkActions] exportToExcel error:', err);
    return { success: false, error: '서버 오류가 발생했습니다.' };
  }
}

// ============================================
// 모듈별 편의 함수
// ============================================

/**
 * 출금 계정과목 일괄 변경
 */
export async function bulkUpdateWithdrawalAccountCode(
  ids: string[],
  accountCode: string
): Promise<BulkUpdateAccountCodeResult> {
  return bulkUpdateAccountCode('/api/v1/withdrawals/bulk-update-account-code', ids, accountCode);
}

/**
 * 입금 계정과목 일괄 변경
 */
export async function bulkUpdateDepositAccountCode(
  ids: string[],
  accountCode: string
): Promise<BulkUpdateAccountCodeResult> {
  return bulkUpdateAccountCode('/api/v1/deposits/bulk-update-account-code', ids, accountCode);
}

/**
 * 매출 계정과목 일괄 변경
 */
export async function bulkUpdateSaleAccountCode(
  ids: string[],
  accountCode: string
): Promise<BulkUpdateAccountCodeResult> {
  return bulkUpdateAccountCode('/api/v1/sales/bulk-update-account-code', ids, accountCode);
}

/**
 * 근태 엑셀 내보내기
 */
export async function exportAttendances(
  params?: { year?: number; month?: number; user_id?: string; department_id?: string }
): Promise<ExportResult> {
  return exportToExcel('/api/v1/attendances/export', params);
}

/**
 * 급여 엑셀 내보내기
 */
export async function exportSalaries(
  params?: { year?: number; month?: number; status?: string }
): Promise<ExportResult> {
  return exportToExcel('/api/v1/salaries/export', params);
}
