<?php
declare(strict_types=1);

namespace App\Modules\Accounting;

/**
 * Egyptian Standard Chart of Accounts — Centralized Constants.
 *
 * 5-level hierarchy:
 *   L1 (عام/الأول)    = 1 digit   (1, 2, 3, 4)
 *   L2 (عام/الثاني)   = 2 digits  (11, 12, 21, 22, 23, 31, 32, 33, 34, 41, 42)
 *   L3 (مساعد/الثالث) = 4 digits  (1101, 1202, 1206, 2101, 2306, 3101, 4101...)
 *   L4 (فرعي/الرابع)  = 6 digits  (110101, 120601, 230601, 310101...)
 *   L5 (جزئي/الخامس) = 8 digits  (11010101, 12060101, 23060101...)
 */
final class AccountCodes
{
    // ══════════════════════════════════════════════════════════════════
    // 1 — ASSETS
    // ══════════════════════════════════════════════════════════════════

    // Cash (under 1206 = النقدية ومافي حكمها)
    const CASH_ON_HAND        = '12060101'; // الصندوق بالجنيه المصري
    const SUB_TREASURY_CASH   = '12060102'; // صندوق الخزنة الفرعية - الأنشطة الرياضية
    const CASH_AT_BANK        = '12060201'; // البنك الرئيسي - جنيه مصري

    // Receivables (under 1203/1204)
    const ACCOUNTS_RECEIVABLE = '120301';   // العملاء
    const EMPLOYEE_LOANS      = '120402';   // سلف عاملين

    // Inventory (under 1202 = المخزون)
    const INVENTORY           = '120209';   // مخزون بضائع بغرض البيع

    // Input Tax
    const INPUT_TAX           = '120408';   // ضريبة مدخلات (under مدينون وأرصدة مدينة)

    // ══════════════════════════════════════════════════════════════════
    // 2 — EQUITY & LIABILITIES
    // ══════════════════════════════════════════════════════════════════

    // 21 = حقوق الملكية (Equity)
    const CAPITAL             = '2101';     // رأس المال المدفوع
    const RETAINED_EARNINGS   = '210201';   // أرباح مرحلة

    // 22 = الإلتزامات الغير المتداولة (Non-current Liabilities)
    const LONG_TERM_LOANS     = '220101';   // قروض من بنوك عملة محلية

    // 23 = الإلتزامات المتداولة (Current Liabilities)
    const ACCOUNTS_PAYABLE    = '230601';   // الموردون
    const TAX_PAYABLE         = '230804';   // جاري مصلحة الضرائب
    const INSURANCE_PAYABLE   = '23080601'; // الهيئة القومية للتأمينات الاجتماعية
    const DEFERRED_REVENUE    = '230809';   // إيرادات مدفوعة مقدما
    const MEMBERSHIP_DEPOSITS = '230801';   // تأمينات للغير
    const ACCRUED_EXPENSES    = '230810';   // مصروفات مستحقة

    // ══════════════════════════════════════════════════════════════════
    // 3 — EXPENSES
    // ══════════════════════════════════════════════════════════════════

    // Personnel (under 3101 = الاجور والمرتبات — تكاليف النشاط)
    const SALARY_EXPENSE      = '310101';   // الاجور الاساسية
    const INSURANCE_EXPENSE   = '310103';   // حصة الشركة في التامينات

    // COGS (under 31 — مخزون بضائع بغرض البيع)
    const COGS                = '3172';     // مخزون بضائع بغرض البيع (تكلفة مبيعات)

    // Bank Charges (under 3314 = عمولة ومصروفات بنكية — مصروفات عمومية وإدارية)
    const BANK_CHARGES        = '331402';   // مصروفات بنكية

    // Depreciation (under 3316 = الاهلاكات — مصروفات عمومية وإدارية)
    const DEPRECIATION        = '3316';     // الاهلاكات

    // ══════════════════════════════════════════════════════════════════
    // 4 — REVENUE (Custom for this club)
    // ══════════════════════════════════════════════════════════════════

    // Membership Revenue (4101) — mapped to actual chart_of_accounts codes
    const FORM_FEE_REVENUE           = '410103'; // استمارات عضويات
    const MEMBERSHIP_VALUE_REVENUE   = '410101'; // عضويات جديدة
    const DEPENDENT_ADDITION_REVENUE = '410102'; // إضافة عضويات
    const MEMBERSHIP_RENEWAL_REVENUE = '410104'; // تجديد عضويات

    // Subscription Revenue (4102) — Academy subscriptions
    const ANNUAL_SUBSCRIPTION        = '410201'; // اكاديمية البادل (primary subscription account)
    const DEVELOPMENT_FEE            = '410202'; // اكاديمية قدم

    // Transfer & Cases Revenue — mapped to actual accounts
    const SEPARATION_FEE_REVENUE     = '410515'; // إيرادات متنوعه (no dedicated account)
    const DIVORCE_FEE_REVENUE        = '410302'; // محل 1 (mapped)
    const DEATH_TRANSFER_REVENUE     = '410515'; // إيرادات متنوعه (no dedicated account)
    const WAIVER_FEE_REVENUE         = '410515'; // إيرادات متنوعه (no dedicated account)
    const SPORTS_CONVERSION_REVENUE  = '410515'; // إيرادات متنوعه (no dedicated account)

    // Special Memberships — mapped to existing accounts
    const SEASONAL_MEMBERSHIP        = '410501'; // قيمه عضويه
    const CARNET_REPLACEMENT         = '410529'; // كارنيهات بدل فائد
    const FOREIGN_MEMBERSHIP         = '410501'; // قيمه عضويه (no separate foreign account)

    // Activities & Sports (4105)
    const ACTIVITY_SUBSCRIPTION      = '410516'; // استمارات نشاط
    const ACADEMY_REVENUE            = '410201'; // اكاديمية البادل
    const HOURLY_BOOKING_REVENUE     = '410523'; // حجز ملاعب

    // Membership installment accounts
    const DOWN_PAYMENT_REVENUE       = '410503'; // مقدم عضويه
    const INSTALLMENT_REVENUE        = '410510'; // الاقساط

    // Sports registration
    const SPORTS_REGISTRATION_REVENUE = '410516'; // استمارات نشاط

    // Fine / Penalty accounts
    const FINE_REVENUE               = '410512'; // غرامة تاخير
    const FINE_LATE_INTEREST         = '410509'; // فوائد تاخير

    // Sales
    const SALES_REVENUE              = '410515'; // إيرادات متنوعه (catch-all for sales)
    const RENTAL_REVENUE             = '410521'; // ايجار محلات

    // Miscellaneous / catch-all
    const MISCELLANEOUS_REVENUE      = '410515'; // إيرادات متنوعه
    const BANK_INTEREST_INCOME       = '410515'; // إيرادات متنوعه

    // Facility Revenue
    const FACILITY_ENTRY_REVENUE     = '410518'; // تذاكر دخول
    const POOL_ENTRY_REVENUE         = '410518'; // تذاكر دخول
    const GUEST_ENTRY_REVENUE        = '410518'; // تذاكر دخول

    // Tournament Revenue
    const TOURNAMENT_FEE_REVENUE     = '410517'; // احداث رياضيه

    // Service Revenue (catch-all — points to متنوعه which exists in DB)
    const SERVICE_REVENUE            = '410515'; // إيرادات متنوعه

    // ══════════════════════════════════════════════════════════════════
    // HELPERS
    // ══════════════════════════════════════════════════════════════════

    public static function debitAccountForMethod(string $method): string
    {
        return match ($method) {
            'cash'          => self::CASH_ON_HAND,
            'check'         => self::CASH_AT_BANK,
            'visa'          => self::CASH_AT_BANK,
            'bank_transfer' => self::CASH_AT_BANK,
            default         => self::CASH_ON_HAND,
        };
    }

    public static function debitAccountForTreasury(string $method, ?int $treasuryId = null): string
    {
        if ($method !== 'cash' || $treasuryId === null) {
            return self::debitAccountForMethod($method);
        }

        $db = \App\Core\App::getInstance()->db();
        $treasury = $db->selectOne("SELECT account_code, type FROM treasuries WHERE id = ?", [$treasuryId]);

        if ($treasury && $treasury['type'] === 'sub') {
            $code = $treasury['account_code'] ?: self::SUB_TREASURY_CASH;
            $account = $db->selectOne(
                "SELECT currency FROM chart_of_accounts WHERE account_code = ? AND is_archived = 0",
                [$code]
            );
            if ($account && ($account['currency'] === '' || $account['currency'] === 'EGP')) {
                return $code;
            }
            return self::CASH_ON_HAND;
        }

        return self::CASH_ON_HAND;
    }

    public static function creditAccountForPaymentType(string $type): string
    {
        return match ($type) {
            'form_fee'              => self::FORM_FEE_REVENUE,
            'membership_fee'        => self::MEMBERSHIP_VALUE_REVENUE,
            'addition_fee'          => self::DEPENDENT_ADDITION_REVENUE,
            'separation_fee'        => self::SEPARATION_FEE_REVENUE,
            'divorce_fee'           => self::DIVORCE_FEE_REVENUE,
            'death_fee'             => self::DEATH_TRANSFER_REVENUE,
            'waiver_fee'            => self::WAIVER_FEE_REVENUE,
            'sports_conversion'     => self::SPORTS_CONVERSION_REVENUE,
            'seasonal_fee'          => self::SEASONAL_MEMBERSHIP,
            'carnet_replacement'    => self::CARNET_REPLACEMENT,
            'annual_subscription'   => self::ANNUAL_SUBSCRIPTION,
            'development_fee'       => self::DEVELOPMENT_FEE,
            'activity_subscription' => self::ACTIVITY_SUBSCRIPTION,
            'hourly_booking'        => self::HOURLY_BOOKING_REVENUE,
            'sports_registration',
            'sa_form_fee'           => self::SPORTS_REGISTRATION_REVENUE,
            'down_payment'          => self::DOWN_PAYMENT_REVENUE,
            'installment'           => self::INSTALLMENT_REVENUE,
            'fine'                  => self::FINE_REVENUE,
            'inventory_sale'        => self::SALES_REVENUE,
            default                 => self::SERVICE_REVENUE,
        };
    }
}
