// src/lib/iran-post.ts

// وزن حجمی = (طول * عرض * ارتفاع در سانتی متر) / 5000
// هزینه پستی بر اساس جدول شرکت ملی پست ایران

export interface IranPostCalculationParams {
  sourceProvinceId: number;
  destinationProvinceId: number;
  weightGrams: number;
  lengthCm?: number;
  widthCm?: number;
  heightCm?: number;
  declaredValue?: number; // ارزش اظهار شده برای بیمه
  serviceType?: "PISHTAZ" | "SEFARESHI" | "VUI";
}

// فاصله ها به صورت تقریبی بر اساس همجواری و فاصله بین استانی تقسیم می‌شوند
// در این نسخه ساده‌سازی شده، ۴ حالت در نظر گرفته شده:
// 1. درون شهری (همان استان و شهر)
// 2. درون استانی
// 3. استان‌های همجوار
// 4. استان‌های غیر همجوار

export enum ZoneType {
  INTRA_PROVINCE = "INTRA_PROVINCE", // درون استانی
  ADJACENT = "ADJACENT", // برون استانی همجوار
  NON_ADJACENT = "NON_ADJACENT" // برون استانی غیرهمجوار
}

// برای مثال، این تابع باید از یک جدول فاصله استانی استفاده کند
// اینجا یک ساده سازی انجام شده
export function getZoneType(srcId: number, destId: number): ZoneType {
  if (srcId === destId) return ZoneType.INTRA_PROVINCE;
  // فرض می‌کنیم در دیتابیس واقعی همجواری بررسی می‌شود
  // برای مثال آی‌دی‌های ۱ تا ۳۰ استان‌ها هستند. اینجا به صورت پیش‌فرض غیرهمجوار برمی‌گردانیم.
  // شما می‌توانید جدول همجواری استان‌ها را اضافه کنید.
  return ZoneType.NON_ADJACENT;
}

export function calculateVolumetricWeight(lengthCm: number, widthCm: number, heightCm: number): number {
  return ((lengthCm * widthCm * heightCm) / 5000) * 1000; // به گرم
}

export function calculateIranPostShipping(params: IranPostCalculationParams) {
  const {
    sourceProvinceId,
    destinationProvinceId,
    weightGrams,
    lengthCm = 0,
    widthCm = 0,
    heightCm = 0,
    declaredValue = 1000000,
    serviceType = "PISHTAZ"
  } = params;

  // محاسبه وزن نهایی (بیشترین مقدار بین وزن واقعی و وزن حجمی)
  const volWeight = calculateVolumetricWeight(lengthCm, widthCm, heightCm);
  const finalWeight = Math.max(weightGrams, volWeight);

  const zone = getZoneType(sourceProvinceId, destinationProvinceId);

  // تعرفه‌های پایه پیشتاز (اعداد فرضی اما نزدیک به واقعیت سال جاری - تومان)
  let baseCost = 0;
  
  if (finalWeight <= 500) {
    if (zone === ZoneType.INTRA_PROVINCE) baseCost = 30000;
    else if (zone === ZoneType.ADJACENT) baseCost = 35000;
    else baseCost = 42000;
  } else if (finalWeight <= 1000) {
    if (zone === ZoneType.INTRA_PROVINCE) baseCost = 35000;
    else if (zone === ZoneType.ADJACENT) baseCost = 42000;
    else baseCost = 50000;
  } else if (finalWeight <= 2000) {
    if (zone === ZoneType.INTRA_PROVINCE) baseCost = 45000;
    else if (zone === ZoneType.ADJACENT) baseCost = 55000;
    else baseCost = 65000;
  } else {
    // برای هر کیلوگرم مازاد
    const extraKg = Math.ceil((finalWeight - 2000) / 1000);
    if (zone === ZoneType.INTRA_PROVINCE) baseCost = 45000 + (extraKg * 10000);
    else if (zone === ZoneType.ADJACENT) baseCost = 55000 + (extraKg * 12000);
    else baseCost = 65000 + (extraKg * 15000);
  }

  // مالیات بر ارزش افزوده (۱۰٪)
  const taxRate = 0.10;
  const tax = Math.round(baseCost * taxRate);

  // هزینه بیمه
  // معمولاً درصدی از ارزش اظهار شده است (مثلاً برای هر یک میلیون تومان ۱۰۰۰ تومان)
  let insuranceCost = 2000; // بیمه پایه
  if (declaredValue > 1000000) {
    const extraVal = declaredValue - 1000000;
    insuranceCost += Math.ceil(extraVal / 1000000) * 1000;
  }

  const totalCost = baseCost + tax + insuranceCost;

  return {
    success: true,
    data: {
      finalWeightGrams: finalWeight,
      isVolumetric: volWeight > weightGrams,
      baseCost,
      tax,
      insuranceCost,
      totalCost,
    }
  };
}
