import type {
  SubscriptionApiData,
  UsageApiData,
  SubscriptionInfo,
  SubscriptionStatus,
} from './types';
import { mapPlanCodeToType } from './types';

// ===== 기본 저장공간 제한 (10GB in bytes) =====
const DEFAULT_STORAGE_LIMIT = 10 * 1024 * 1024 * 1024; // 10GB

// ===== 바이트 → 읽기 쉬운 단위 변환 =====
export function formatBytes(bytes: number): string {
  if (bytes === 0) return '0 B';

  const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
  const k = 1024;
  const i = Math.floor(Math.log(bytes) / Math.log(k));
  const value = bytes / Math.pow(k, i);

  // 소수점 처리: 정수면 소수점 없이, 아니면 최대 2자리
  const formatted = value % 1 === 0 ? value.toString() : value.toFixed(2).replace(/\.?0+$/, '');

  return `${formatted} ${units[i]}`;
}

// ===== API → Frontend 변환 =====
export function transformApiToFrontend(
  subscriptionData: SubscriptionApiData | null,
  usageData: UsageApiData | null
): SubscriptionInfo {
  const plan = subscriptionData?.plan;
  const payments = subscriptionData?.payments || [];
  const lastPayment = payments.find(p => p.status === 'completed');

  // 플랜 코드 → 타입 변환
  const planType = mapPlanCodeToType(plan?.code || null);

  // 다음 결제일 (ended_at이 다음 결제일)
  const nextPaymentDate = subscriptionData?.ended_at?.split('T')[0] || '';

  // 마지막 결제일
  const lastPaymentDate = lastPayment?.paid_at?.split('T')[0] || '';

  // 구독 금액
  const price = plan?.price;
  const subscriptionAmount = typeof price === 'string' ? parseFloat(price) : (price || 0);

  // 상태 매핑
  const status = (subscriptionData?.status || 'pending') as SubscriptionStatus;

  return {
    // 구독 ID
    id: subscriptionData?.id,

    // 결제 정보
    lastPaymentDate,
    nextPaymentDate,
    subscriptionAmount,

    // 구독 플랜 정보
    plan: planType,
    planName: plan?.name || PLAN_LABELS_LOCAL[planType],
    status,
    remainingDays: usageData?.subscription?.remaining_days ?? null,

    // 사용량 정보
    userCount: usageData?.users?.used ?? 0,
    userLimit: usageData?.users?.limit === 0 ? null : (usageData?.users?.limit ?? null),
    storageUsed: usageData?.storage?.used ?? 0,
    storageLimit: usageData?.storage?.limit || DEFAULT_STORAGE_LIMIT,
    storageUsedFormatted: usageData?.storage?.used_formatted || formatBytes(usageData?.storage?.used ?? 0),
    storageLimitFormatted: usageData?.storage?.limit_formatted || formatBytes(usageData?.storage?.limit || DEFAULT_STORAGE_LIMIT),

    // API 호출 사용량 (일간)
    apiCallsUsed: usageData?.api_calls?.used ?? 0,
    apiCallsLimit: usageData?.api_calls?.limit ?? 10000,
  };
}

// 로컬 플랜 라벨 (순환 참조 방지)
const PLAN_LABELS_LOCAL: Record<string, string> = {
  free: '무료',
  basic: '베이직',
  premium: '프리미엄',
  enterprise: '엔터프라이즈',
};
