/**
 * 단가 목록 페이지
 *
 * 경로: /sales/pricing-management
 * API:
 *   - GET /api/v1/items - 품목 목록 (품목기준관리에서 등록한 전체 품목)
 *   - GET /api/v1/pricing - 단가 목록 (등록된 단가 정보)
 *
 * 데이터 흐름:
 *   품목 목록 + 단가 목록 → 병합 → 품목별 단가 현황 표시
 */

import { PricingListClient } from '@/components/pricing';
import type { PricingListItem, PricingStatus } from '@/components/pricing';
import { cookies } from 'next/headers';

// ============================================
// API 응답 타입 정의
// ============================================

// 품목 API 응답 타입 (GET /api/v1/items)
interface ItemApiData {
  id: number;
  item_type: string; // FG, PT, SM, RM, CS (품목 유형)
  code: string;
  name: string;
  unit: string;
  category_id: number | null;
  created_at: string;
  deleted_at: string | null;
}

interface ItemsApiResponse {
  success: boolean;
  data: {
    current_page: number;
    data: ItemApiData[];
    total: number;
    per_page: number;
    last_page: number;
  };
  message: string;
}

// 단가 API 응답 타입 (GET /api/v1/pricing)
interface PriceApiItem {
  id: number;
  tenant_id: number;
  item_type_code: string; // FG, PT, SM, RM, CS (items.item_type과 동일)
  item_id: number;
  client_group_id: number | null;
  purchase_price: string | null;
  processing_cost: string | null;
  loss_rate: string | null;
  margin_rate: string | null;
  sales_price: string | null;
  rounding_rule: 'round' | 'ceil' | 'floor';
  rounding_unit: number;
  supplier: string | null;
  effective_from: string;
  effective_to: string | null;
  status: 'draft' | 'active' | 'finalized';
  is_final: boolean;
  finalized_at: string | null;
  finalized_by: number | null;
  note: string | null;
  created_at: string;
  updated_at: string;
  deleted_at: string | null;
  client_group?: {
    id: number;
    name: string;
  };
  product?: {
    id: number;
    product_code: string;
    product_name: string;
    specification: string | null;
    unit: string;
    product_type: string;
  };
  material?: {
    id: number;
    item_code: string;
    item_name: string;
    specification: string | null;
    unit: string;
    product_type: string;
  };
}

interface PricingApiResponse {
  success: boolean;
  data: {
    current_page: number;
    data: PriceApiItem[];
    total: number;
    per_page: number;
    last_page: number;
  };
  message: string;
}

// ============================================
// 헬퍼 함수
// ============================================

// API 헤더 생성
async function getApiHeaders(): Promise<HeadersInit> {
  const cookieStore = await cookies();
  const token = cookieStore.get('access_token')?.value;

  return {
    'Accept': 'application/json',
    'Authorization': token ? `Bearer ${token}` : '',
    'X-API-KEY': process.env.API_KEY || '',
  };
}

// 품목 유형 매핑 (type_code → 프론트엔드 ItemType)
function mapItemType(typeCode?: string): string {
  switch (typeCode) {
    case 'FG': return 'FG'; // 제품
    case 'PT': return 'PT'; // 부품
    case 'SM': return 'SM'; // 부자재
    case 'RM': return 'RM'; // 원자재
    case 'CS': return 'CS'; // 소모품
    default: return 'PT';
  }
}

// API 상태 → 프론트엔드 상태 매핑
function mapStatus(apiStatus: string, isFinal: boolean): PricingStatus | 'not_registered' {
  if (isFinal) return 'finalized';
  switch (apiStatus) {
    case 'draft': return 'draft';
    case 'active': return 'active';
    case 'finalized': return 'finalized';
    default: return 'draft';
  }
}

// ============================================
// API 호출 함수
// ============================================

// 품목 목록 조회
async function getItemsList(): Promise<ItemApiData[]> {
  try {
    const headers = await getApiHeaders();

    const response = await fetch(
      `${process.env.NEXT_PUBLIC_API_URL}/api/v1/items?group_id=1&size=100`,
      {
        method: 'GET',
        headers,
        cache: 'no-store',
      }
    );

    if (!response.ok) {
      console.error('[PricingPage] Items API Error:', response.status, response.statusText);
      return [];
    }

    const result: ItemsApiResponse = await response.json();

    if (!result.success || !result.data?.data) {
      console.warn('[PricingPage] No items data in response');
      return [];
    }

    return result.data.data;
  } catch (error) {
    console.error('[PricingPage] Items fetch error:', error);
    return [];
  }
}

// 단가 목록 조회
async function getPricingList(): Promise<PriceApiItem[]> {
  try {
    const headers = await getApiHeaders();

    const response = await fetch(
      `${process.env.NEXT_PUBLIC_API_URL}/api/v1/pricing?size=100`,
      {
        method: 'GET',
        headers,
        cache: 'no-store',
      }
    );

    if (!response.ok) {
      console.error('[PricingPage] Pricing API Error:', response.status, response.statusText);
      return [];
    }

    const result: PricingApiResponse = await response.json();
    console.log('[PricingPage] Pricing API Response count:', result.data?.data?.length || 0);

    if (!result.success || !result.data?.data) {
      console.warn('[PricingPage] No pricing data in response');
      return [];
    }

    return result.data.data;
  } catch (error) {
    console.error('[PricingPage] Pricing fetch error:', error);
    return [];
  }
}

// ============================================
// 데이터 병합 함수
// ============================================

/**
 * 품목 목록 + 단가 목록 병합
 *
 * - 품목 목록을 기준으로 순회
 * - 각 품목에 해당하는 단가 정보를 매핑 (item_type + item_id로 매칭)
 * - 단가 미등록 품목은 'not_registered' 상태로 표시
 */
function mergeItemsWithPricing(
  items: ItemApiData[],
  pricings: PriceApiItem[]
): PricingListItem[] {
  // 단가 정보를 빠르게 찾기 위한 Map 생성
  // key: "{item_type}_{item_id}" (예: "FG_123", "PT_456")
  const pricingMap = new Map<string, PriceApiItem>();

  for (const pricing of pricings) {
    const key = `${pricing.item_type_code}_${pricing.item_id}`;
    // 같은 품목에 여러 단가가 있을 수 있으므로 최신 것만 사용
    if (!pricingMap.has(key)) {
      pricingMap.set(key, pricing);
    }
  }

  // 품목 목록을 기준으로 병합
  return items.map((item) => {
    const key = `${item.item_type}_${item.id}`;
    const pricing = pricingMap.get(key);

    if (pricing) {
      // 단가 등록된 품목
      return {
        id: String(pricing.id),
        itemId: String(item.id),
        itemCode: item.code,
        itemName: item.name,
        itemType: mapItemType(item.item_type),
        specification: undefined, // items API에서는 specification 미제공
        unit: item.unit || 'EA',
        purchasePrice: pricing.purchase_price ? parseFloat(pricing.purchase_price) : undefined,
        processingCost: pricing.processing_cost ? parseFloat(pricing.processing_cost) : undefined,
        salesPrice: pricing.sales_price ? parseFloat(pricing.sales_price) : undefined,
        marginRate: pricing.margin_rate ? parseFloat(pricing.margin_rate) : undefined,
        effectiveDate: pricing.effective_from,
        status: mapStatus(pricing.status, pricing.is_final),
        currentRevision: 0,
        isFinal: pricing.is_final,
        itemTypeCode: item.item_type, // FG, PT, SM, RM, CS (단가 등록 시 필요)
      };
    } else {
      // 단가 미등록 품목
      return {
        id: `item_${item.id}`, // 임시 ID (단가 ID가 없으므로)
        itemId: String(item.id),
        itemCode: item.code,
        itemName: item.name,
        itemType: mapItemType(item.item_type),
        specification: undefined,
        unit: item.unit || 'EA',
        purchasePrice: undefined,
        processingCost: undefined,
        salesPrice: undefined,
        marginRate: undefined,
        effectiveDate: undefined,
        status: 'not_registered' as const,
        currentRevision: 0,
        isFinal: false,
        itemTypeCode: item.item_type, // FG, PT, SM, RM, CS (단가 등록 시 필요)
      };
    }
  });
}

// ============================================
// 페이지 컴포넌트
// ============================================

export default async function PricingManagementPage() {
  // 품목 목록과 단가 목록을 병렬로 조회
  const [items, pricings] = await Promise.all([
    getItemsList(),
    getPricingList(),
  ]);

  console.log('[PricingPage] Items count:', items.length);
  console.log('[PricingPage] Pricings count:', pricings.length);

  // 데이터 병합
  const mergedData = mergeItemsWithPricing(items, pricings);
  console.log('[PricingPage] Merged data count:', mergedData.length);

  return (
    <PricingListClient initialData={mergedData} />
  );
}