<?php

namespace App\Helpers;

use App\Models\User;

/**
 * Kalkulasi ongkir berdasarkan wilayah:
 * - Kota sama          → Rp 15.000
 * - Beda kota, provinsi sama → Rp 15.000 + 20.000 = Rp 35.000  (dalam provinsi)
 * - Beda provinsi      → Rp 15.000 + 50.000 = Rp 65.000  (luar kota/pulau)
 */
class ShippingCalculator
{
    const BASE_FEE          = 15000;   // Ongkir dasar semua order
    const INTER_CITY_FEE    = 20000;   // Tambahan beda kota, provinsi sama
    const INTER_PROVINCE_FEE = 50000;  // Tambahan beda provinsi

    /**
     * Hitung ongkir berdasarkan kode provinsi & kota user vs toko.
     *
     * @param  string|null  $userProvinceCode   Kode provinsi user (dari tabel addresses)
     * @param  string|null  $userCityCode       Kode kota/kab user
     * @return int  Ongkir dalam rupiah
     */
    public static function calculate(?string $userProvinceCode, ?string $userCityCode): int
    {
        // Ambil data admin (toko)
        $admin = User::where('role', 'admin')->first();

        if (!$admin || !$userProvinceCode || !$userCityCode) {
            return self::BASE_FEE;
        }

        $storeProvinceCode = $admin->province_id;   // kolom province_id di tabel users
        $storeCityCode     = $admin->regency_id;    // kolom regency_id di tabel users

        // Beda provinsi
        if ($userProvinceCode !== $storeProvinceCode) {
            return self::BASE_FEE + self::INTER_PROVINCE_FEE;
        }

        // Beda kota tapi provinsi sama
        if ($userCityCode !== $storeCityCode) {
            return self::BASE_FEE + self::INTER_CITY_FEE;
        }

        // Kota sama
        return self::BASE_FEE;
    }

    /**
     * Kembalikan label zona pengiriman.
     */
    public static function getZoneLabel(?string $userProvinceCode, ?string $userCityCode): string
    {
        $admin = User::where('role', 'admin')->first();
        if (!$admin || !$userProvinceCode || !$userCityCode) return 'Tidak diketahui';

        if ($userProvinceCode !== $admin->province_id) return 'Luar Kota / Luar Pulau';
        if ($userCityCode !== $admin->regency_id)      return 'Dalam Provinsi';
        return 'Kota yang Sama';
    }

    /**
     * Format rupiah.
     */
    public static function format(int $amount): string
    {
        return 'Rp ' . number_format($amount, 0, ',', '.');
    }
}