<?php

declare(strict_types=1);

namespace App\Enums;

/**
 * Categorías de Egresos del Sistema Credify.
 *
 * MODELO DE CATEGORÍAS (Phase 1 - Enhanced Accounting):
 * ======================================================
 *
 * 1. OPERACIONES DE CRÉDITO (controladas por el sistema):
 *    - credit_disbursement: Desembolso de crédito
 *    - financial_adjustment: Ajustes financieros (extensiones, refinanciamientos)
 *
 * 2. TRANSACCIONES DE CAPITAL (afectan patrimonio, no P&L):
 *    - profit_withdrawal: Retiro de utilidades del propietario
 *    - capital_return: Devolución de capital a inversionista
 *    - dividend_payment: Pago de dividendos
 *
 * 3. GASTOS OPERATIVOS (afectan P&L):
 *    - salary_wages: Salarios y prestaciones
 *    - rent: Arrendamiento
 *    - utilities: Servicios públicos
 *    - transportation: Transporte y viáticos
 *    - marketing: Marketing y publicidad
 *    - office_supplies: Útiles de oficina
 *    - professional_services: Servicios profesionales
 *    - commission: Comisiones a cobradores
 *    - bank_fees: Comisiones bancarias
 *    - other_operational: Otros gastos operativos
 *
 * 4. PROVISIONES Y CASTIGOS:
 *    - bad_debt_provision: Provisión por cartera dudosa
 *    - bad_debt_writeoff: Castigo de cartera incobrable
 *
 * 5. AJUSTES:
 *    - refund: Reembolso a cliente
 *    - adjustment: Ajuste contable
 *
 * REGLAS DE IMPACTO FINANCIERO:
 * =============================
 * - affects_cash: ¿Reduce el efectivo disponible?
 * - reduces_capital: ¿Reduce el capital de trabajo?
 * - affects_profit: ¿Reduce las utilidades del período?
 */
enum ExpenseCategory: string
{
    // ═══════════════════════════════════════════════════════════════════════
    // CREDIT OPERATIONS (system-controlled)
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Credit disbursement to client.
     * Reduces CAPITAL (working capital out), does NOT reduce profit.
     */
    case CREDIT_DISBURSEMENT = 'credit_disbursement';

    /**
     * @deprecated Use CREDIT_DISBURSEMENT instead
     * Maintained for backward compatibility with existing data
     */
    case DISBURSEMENT = 'disbursement';

    /**
     * Financial adjustment for restructuring operations.
     * Impact depends on specific operation.
     */
    case FINANCIAL_ADJUSTMENT = 'financial_adjustment';

    // ═══════════════════════════════════════════════════════════════════════
    // CAPITAL TRANSACTIONS (affect equity, not operating expenses)
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Owner profit withdrawal.
     * Reduces RETAINED EARNINGS, does NOT reduce operating profit.
     */
    case PROFIT_WITHDRAWAL = 'profit_withdrawal';

    /**
     * Return capital to investor.
     * Reduces CAPITAL (equity), does NOT affect profit.
     */
    case CAPITAL_RETURN = 'capital_return';

    /**
     * Dividend payment to shareholders.
     * Reduces RETAINED EARNINGS, does NOT reduce operating profit.
     */
    case DIVIDEND_PAYMENT = 'dividend_payment';

    // ═══════════════════════════════════════════════════════════════════════
    // OPERATIONAL EXPENSES (affect P&L)
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Salaries, wages, and benefits.
     */
    case SALARY_WAGES = 'salary_wages';

    /**
     * Rent and lease payments.
     */
    case RENT = 'rent';

    /**
     * Utilities: electricity, water, internet, phone.
     */
    case UTILITIES = 'utilities';

    /**
     * Transportation and travel expenses.
     */
    case TRANSPORTATION = 'transportation';

    /**
     * Marketing and advertising.
     */
    case MARKETING = 'marketing';

    /**
     * Office supplies and materials.
     */
    case OFFICE_SUPPLIES = 'office_supplies';

    /**
     * Professional services: legal, accounting, consulting.
     */
    case PROFESSIONAL_SERVICES = 'professional_services';

    /**
     * Commissions to collectors.
     */
    case COMMISSION = 'commission';

    /**
     * Bank fees and charges.
     */
    case BANK_FEES = 'bank_fees';

    /**
     * Other operational expenses not classified elsewhere.
     */
    case OTHER_OPERATIONAL = 'other_operational';

    // ═══════════════════════════════════════════════════════════════════════
    // PROVISIONS & WRITE-OFFS
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Provision for doubtful accounts.
     * Affects PROFIT (expense), does NOT affect cash immediately.
     */
    case BAD_DEBT_PROVISION = 'bad_debt_provision';

    /**
     * Write-off of uncollectable debt.
     * Reduces CAPITAL (asset written off), typically already provisioned.
     */
    case BAD_DEBT_WRITEOFF = 'bad_debt_writeoff';

    // ═══════════════════════════════════════════════════════════════════════
    // ADJUSTMENTS
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Refund to customer.
     * Contra-revenue, affects profit.
     */
    case REFUND = 'refund';

    /**
     * General accounting adjustment.
     * Impact is configurable.
     */
    case ADJUSTMENT = 'adjustment';

    /**
     * Interest / balance waiver on early settlement (condonación).
     *
     * Created automatically by SettleCreditAction when a credit is closed
     * with a forgiven balance (discount for early payment / debt forgiveness).
     *
     * Financial impact:
     *   - affects_cash   = FALSE  → no money leaves the business
     *   - reduces_capital= FALSE  → capital at risk doesn't change (interest, not principal)
     *   - affects_profit = TRUE   → reduces expected (but unrealized) interest income
     *
     * On a cash-basis system the waived interest was never booked as income,
     * so this entry serves as a management memo: it shows what profit was sacrificed.
     */
    case INTEREST_WAIVER = 'interest_waiver';

    // ═══════════════════════════════════════════════════════════════════════
    // LEGACY (for backward compatibility)
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * @deprecated Use specific operational categories
     */
    case OPERATIONAL = 'operational';

    /**
     * @deprecated Use specific operational categories (SALARY_WAGES, RENT, etc.)
     */
    case ADMIN_EXPENSE = 'admin_expense';

    /**
     * @deprecated Use BAD_DEBT_WRITEOFF
     */
    case BAD_DEBT = 'bad_debt';

    // ═══════════════════════════════════════════════════════════════════════
    // CATEGORY GROUPING METHODS
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Credit operation categories (system-controlled).
     */
    public static function creditOperationCategories(): array
    {
        return [
            self::CREDIT_DISBURSEMENT,
            self::DISBURSEMENT, // Legacy
            self::FINANCIAL_ADJUSTMENT,
        ];
    }

    /**
     * Capital transaction categories (affect equity, not P&L).
     */
    public static function capitalCategories(): array
    {
        return [
            self::PROFIT_WITHDRAWAL,
            self::CAPITAL_RETURN,
            self::DIVIDEND_PAYMENT,
        ];
    }

    /**
     * Operational expense categories (affect P&L).
     */
    public static function operationalCategories(): array
    {
        return [
            self::SALARY_WAGES,
            self::RENT,
            self::UTILITIES,
            self::TRANSPORTATION,
            self::MARKETING,
            self::OFFICE_SUPPLIES,
            self::PROFESSIONAL_SERVICES,
            self::COMMISSION,
            self::BANK_FEES,
            self::OTHER_OPERATIONAL,
            self::OPERATIONAL, // Legacy
            self::ADMIN_EXPENSE, // Legacy
        ];
    }

    /**
     * Provision and write-off categories.
     */
    public static function provisionCategories(): array
    {
        return [
            self::BAD_DEBT_PROVISION,
            self::BAD_DEBT_WRITEOFF,
            self::BAD_DEBT, // Legacy
        ];
    }

    /**
     * Adjustment categories.
     */
    public static function adjustmentCategories(): array
    {
        return [
            self::REFUND,
            self::ADJUSTMENT,
            self::INTEREST_WAIVER,
        ];
    }

    /**
     * Legacy categories that should be migrated.
     */
    public static function legacyCategories(): array
    {
        return [
            self::DISBURSEMENT,
            self::OPERATIONAL,
            self::ADMIN_EXPENSE,
            self::BAD_DEBT,
        ];
    }

    /**
     * Categories available for manual creation in UI.
     */
    public static function manualCreationCategories(): array
    {
        return [
            // Capital
            self::PROFIT_WITHDRAWAL,
            self::CAPITAL_RETURN,
            self::DIVIDEND_PAYMENT,
            // Operational
            self::SALARY_WAGES,
            self::RENT,
            self::UTILITIES,
            self::TRANSPORTATION,
            self::MARKETING,
            self::OFFICE_SUPPLIES,
            self::PROFESSIONAL_SERVICES,
            self::COMMISSION,
            self::BANK_FEES,
            self::OTHER_OPERATIONAL,
            // Provisions
            self::BAD_DEBT_PROVISION,
            self::BAD_DEBT_WRITEOFF,
            // Adjustments
            self::REFUND,
            self::ADJUSTMENT,
        ];
    }

    // ═══════════════════════════════════════════════════════════════════════
    // BOOLEAN CHECK METHODS
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Is this a credit operation (system-controlled)?
     */
    public function isCreditOperation(): bool
    {
        return in_array($this, self::creditOperationCategories(), true);
    }

    /**
     * Is this a capital transaction?
     */
    public function isCapitalTransaction(): bool
    {
        return in_array($this, self::capitalCategories(), true);
    }

    /**
     * Is this an operational expense?
     */
    public function isOperational(): bool
    {
        return in_array($this, self::operationalCategories(), true);
    }

    /**
     * Is this a provision or write-off?
     */
    public function isProvision(): bool
    {
        return in_array($this, self::provisionCategories(), true);
    }

    /**
     * Is this an adjustment?
     */
    public function isAdjustment(): bool
    {
        return in_array($this, self::adjustmentCategories(), true);
    }

    /**
     * Is this a legacy category?
     */
    public function isLegacy(): bool
    {
        return in_array($this, self::legacyCategories(), true);
    }

    /**
     * Can this category be created manually?
     */
    public function canBeCreatedManually(): bool
    {
        return in_array($this, self::manualCreationCategories(), true);
    }

    // ═══════════════════════════════════════════════════════════════════════
    // FINANCIAL IMPACT METHODS
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Does this expense affect cash balance?
     */
    public function affectsCash(): bool
    {
        return match ($this) {
            // Credit operations always affect cash
            self::CREDIT_DISBURSEMENT,
            self::DISBURSEMENT => true, // Legacy
            self::FINANCIAL_ADJUSTMENT => true, // Usually, but can vary

            // Capital transactions affect cash
            self::PROFIT_WITHDRAWAL,
            self::CAPITAL_RETURN,
            self::DIVIDEND_PAYMENT => true,

            // Operational expenses affect cash
            self::SALARY_WAGES,
            self::RENT,
            self::UTILITIES,
            self::TRANSPORTATION,
            self::MARKETING,
            self::OFFICE_SUPPLIES,
            self::PROFESSIONAL_SERVICES,
            self::COMMISSION,
            self::BANK_FEES,
            self::ADMIN_EXPENSE,
            self::OTHER_OPERATIONAL,
            self::OPERATIONAL => true,

            // Provisions do NOT affect cash (accounting entry only)
            self::BAD_DEBT_PROVISION => false,

            // Write-offs typically don't affect cash (asset already lost)
            self::BAD_DEBT_WRITEOFF,
            self::BAD_DEBT => false,

            // Refunds affect cash
            self::REFUND => true,

            // Adjustments can vary
            self::ADJUSTMENT => true, // Default to true, can be overridden

            // Interest waiver: no cash impact (key rule for condonation)
            self::INTEREST_WAIVER => false,
        };
    }

    /**
     * Does this expense reduce working capital?
     */
    public function reducesCapital(): bool
    {
        return match ($this) {
            // Credit disbursement reduces capital (money lent out)
            self::CREDIT_DISBURSEMENT,
            self::DISBURSEMENT => true, // Legacy

            // Capital return reduces equity/capital
            self::CAPITAL_RETURN => true,

            // Bad debt write-off reduces capital (asset written off)
            self::BAD_DEBT_WRITEOFF,
            self::BAD_DEBT => true,

            // Profit withdrawal reduces retained earnings, not working capital
            self::PROFIT_WITHDRAWAL,
            self::DIVIDEND_PAYMENT => false,

            // Operational expenses don't directly reduce capital
            self::SALARY_WAGES,
            self::RENT,
            self::UTILITIES,
            self::TRANSPORTATION,
            self::MARKETING,
            self::OFFICE_SUPPLIES,
            self::PROFESSIONAL_SERVICES,
            self::COMMISSION,
            self::BANK_FEES,
            self::ADMIN_EXPENSE,
            self::OTHER_OPERATIONAL,
            self::OPERATIONAL => false,

            // Provisions don't reduce capital
            self::BAD_DEBT_PROVISION => false,

            // Financial adjustments depend on operation
            self::FINANCIAL_ADJUSTMENT => false,

            // Refunds reduce capital (returning money that was counted as income)
            self::REFUND => true,

            // Adjustments can vary
            self::ADJUSTMENT => false,

            // Interest waiver doesn't reduce working capital
            self::INTEREST_WAIVER => false,
        };
    }

    /**
     * Does this expense affect profit (P&L)?
     */
    public function affectsProfit(): bool
    {
        return match ($this) {
            // Credit disbursement is capital movement, not expense
            self::CREDIT_DISBURSEMENT,
            self::DISBURSEMENT => false, // Legacy

            // Capital return is equity movement, not expense
            self::CAPITAL_RETURN => false,

            // Financial adjustments typically don't affect current profit
            self::FINANCIAL_ADJUSTMENT => false,

            // Profit withdrawal reduces retained earnings, affects profit distribution
            self::PROFIT_WITHDRAWAL,
            self::DIVIDEND_PAYMENT => true, // Reduces distributable profit

            // All operational expenses affect profit
            self::SALARY_WAGES,
            self::RENT,
            self::UTILITIES,
            self::TRANSPORTATION,
            self::MARKETING,
            self::OFFICE_SUPPLIES,
            self::PROFESSIONAL_SERVICES,
            self::COMMISSION,
            self::BANK_FEES,
            self::ADMIN_EXPENSE,
            self::OTHER_OPERATIONAL,
            self::OPERATIONAL => true,

            // Provisions affect profit (expense recognition)
            self::BAD_DEBT_PROVISION => true,

            // Write-offs typically don't affect profit if already provisioned
            self::BAD_DEBT_WRITEOFF,
            self::BAD_DEBT => false,

            // Refunds are contra-revenue, affect profit
            self::REFUND => true,

            // Adjustments can affect profit
            self::ADJUSTMENT => true,

            // Interest waiver reduces expected profit (waived interest income)
            self::INTEREST_WAIVER => true,
        };
    }

    // ═══════════════════════════════════════════════════════════════════════
    // EDIT/DELETE PERMISSION METHODS
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Can this expense record be edited?
     */
    public function canBeEdited(): bool
    {
        return match ($this) {
            // Credit operations are system-controlled
            self::CREDIT_DISBURSEMENT,
            self::DISBURSEMENT, // Legacy
            self::FINANCIAL_ADJUSTMENT => false,

            // Capital transactions: limited editing
            self::PROFIT_WITHDRAWAL,
            self::CAPITAL_RETURN,
            self::DIVIDEND_PAYMENT => true, // Time-limited at service layer

            // Operational: can edit
            self::SALARY_WAGES,
            self::RENT,
            self::UTILITIES,
            self::TRANSPORTATION,
            self::MARKETING,
            self::OFFICE_SUPPLIES,
            self::PROFESSIONAL_SERVICES,
            self::COMMISSION,
            self::BANK_FEES,
            self::ADMIN_EXPENSE,
            self::OTHER_OPERATIONAL,
            self::OPERATIONAL => true,

            // Provisions: can edit
            self::BAD_DEBT_PROVISION => true,

            // Write-offs: limited
            self::BAD_DEBT_WRITEOFF,
            self::BAD_DEBT => false,

            // Adjustments
            self::REFUND => true, // Time-limited at service layer
            self::ADJUSTMENT => true,

            // Interest waiver is system-controlled — cannot be edited
            self::INTEREST_WAIVER => false,
        };
    }

    /**
     * Can this expense record be deleted?
     */
    public function canBeDeleted(): bool
    {
        return match ($this) {
            // Credit operations cannot be deleted
            self::CREDIT_DISBURSEMENT,
            self::DISBURSEMENT, // Legacy
            self::FINANCIAL_ADJUSTMENT => false,

            // Capital transactions should use compensating entry
            self::PROFIT_WITHDRAWAL,
            self::CAPITAL_RETURN,
            self::DIVIDEND_PAYMENT => false,

            // Operational: can delete
            self::SALARY_WAGES,
            self::RENT,
            self::UTILITIES,
            self::TRANSPORTATION,
            self::MARKETING,
            self::OFFICE_SUPPLIES,
            self::PROFESSIONAL_SERVICES,
            self::COMMISSION,
            self::BANK_FEES,
            self::ADMIN_EXPENSE,
            self::OTHER_OPERATIONAL,
            self::OPERATIONAL => true,

            // Provisions: can delete (before period close)
            self::BAD_DEBT_PROVISION => true,

            // Write-offs: cannot delete
            self::BAD_DEBT_WRITEOFF,
            self::BAD_DEBT => false,

            // Adjustments
            self::REFUND => false, // Should use compensating entry
            self::ADJUSTMENT => true,

            // Interest waiver is system-controlled — cannot be deleted
            self::INTEREST_WAIVER => false,
        };
    }

    /**
     * Does this category require approval?
     */
    public function requiresApproval(): bool
    {
        return match ($this) {
            self::PROFIT_WITHDRAWAL,
            self::CAPITAL_RETURN,
            self::DIVIDEND_PAYMENT,
            self::BAD_DEBT_WRITEOFF,
            self::BAD_DEBT,
            self::REFUND => true,
            default => false,
        };
    }

    /**
     * Does this category require a credit_id relationship?
     */
    public function requiresCreditId(): bool
    {
        return match ($this) {
            self::CREDIT_DISBURSEMENT,
            self::DISBURSEMENT, // Legacy
            self::BAD_DEBT_WRITEOFF,
            self::BAD_DEBT,
            // Interest waiver must be linked to the settled credit
            self::INTEREST_WAIVER => true,
            default => false,
        };
    }

    // ═══════════════════════════════════════════════════════════════════════
    // UI DISPLAY METHODS
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Human-readable label for UI.
     */
    public function getLabel(): string
    {
        return match ($this) {
            // Credit operations
            self::CREDIT_DISBURSEMENT,
            self::DISBURSEMENT => 'Desembolso de crédito',
            self::FINANCIAL_ADJUSTMENT => 'Ajuste financiero',

            // Capital
            self::PROFIT_WITHDRAWAL => 'Retiro de utilidades',
            self::CAPITAL_RETURN => 'Devolución de capital',
            self::DIVIDEND_PAYMENT => 'Pago de dividendos',

            // Operational
            self::SALARY_WAGES => 'Salarios y prestaciones',
            self::RENT => 'Arrendamiento',
            self::UTILITIES => 'Servicios públicos',
            self::TRANSPORTATION => 'Transporte y viáticos',
            self::MARKETING => 'Marketing y publicidad',
            self::OFFICE_SUPPLIES => 'Útiles de oficina',
            self::PROFESSIONAL_SERVICES => 'Servicios profesionales',
            self::COMMISSION => 'Comisiones',
            self::BANK_FEES => 'Comisiones bancarias',
            self::OTHER_OPERATIONAL => 'Otro gasto operativo',
            self::OPERATIONAL => 'Gasto operativo',
            self::ADMIN_EXPENSE => 'Gasto administrativo',

            // Provisions
            self::BAD_DEBT_PROVISION => 'Provisión cartera dudosa',
            self::BAD_DEBT_WRITEOFF => 'Castigo de cartera',
            self::BAD_DEBT => 'Cartera incobrable',

            // Adjustments
            self::REFUND => 'Reembolso a cliente',
            self::ADJUSTMENT => 'Ajuste contable',
            self::INTEREST_WAIVER => 'Condonación de saldo',
        };
    }

    /**
     * Color for badges in UI.
     */
    public function getColor(): string
    {
        return match ($this) {
            // Credit operations: red tones (money out)
            self::CREDIT_DISBURSEMENT,
            self::DISBURSEMENT => 'danger',
            self::FINANCIAL_ADJUSTMENT => 'rose',

            // Capital: purple tones
            self::PROFIT_WITHDRAWAL => 'purple',
            self::CAPITAL_RETURN => 'violet',
            self::DIVIDEND_PAYMENT => 'fuchsia',

            // Operational: gray/blue tones
            self::SALARY_WAGES => 'blue',
            self::RENT => 'slate',
            self::UTILITIES => 'zinc',
            self::TRANSPORTATION => 'sky',
            self::MARKETING => 'cyan',
            self::OFFICE_SUPPLIES => 'stone',
            self::PROFESSIONAL_SERVICES => 'indigo',
            self::COMMISSION => 'teal',
            self::BANK_FEES => 'gray',
            self::OTHER_OPERATIONAL => 'neutral',
            self::OPERATIONAL => 'neutral',
            self::ADMIN_EXPENSE => 'neutral',

            // Provisions: warning tones
            self::BAD_DEBT_PROVISION => 'warning',
            self::BAD_DEBT_WRITEOFF => 'orange',
            self::BAD_DEBT => 'orange',

            // Adjustments
            self::REFUND => 'amber',
            self::ADJUSTMENT => 'lime',
            self::INTEREST_WAIVER => 'purple',
        };
    }

    /**
     * Icon for UI display.
     */
    public function getIcon(): string
    {
        return match ($this) {
            self::CREDIT_DISBURSEMENT,
            self::DISBURSEMENT => 'heroicon-o-banknotes',
            self::FINANCIAL_ADJUSTMENT => 'heroicon-o-adjustments-horizontal',

            self::PROFIT_WITHDRAWAL => 'heroicon-o-arrow-up-tray',
            self::CAPITAL_RETURN => 'heroicon-o-arrow-uturn-left',
            self::DIVIDEND_PAYMENT => 'heroicon-o-gift',

            self::SALARY_WAGES => 'heroicon-o-users',
            self::RENT => 'heroicon-o-home',
            self::UTILITIES => 'heroicon-o-bolt',
            self::TRANSPORTATION => 'heroicon-o-truck',
            self::MARKETING => 'heroicon-o-megaphone',
            self::OFFICE_SUPPLIES => 'heroicon-o-clipboard-document-list',
            self::PROFESSIONAL_SERVICES => 'heroicon-o-briefcase',
            self::COMMISSION => 'heroicon-o-currency-dollar',
            self::BANK_FEES => 'heroicon-o-building-library',
            self::OTHER_OPERATIONAL,
            self::OPERATIONAL,
            self::ADMIN_EXPENSE => 'heroicon-o-folder',

            self::BAD_DEBT_PROVISION => 'heroicon-o-shield-exclamation',
            self::BAD_DEBT_WRITEOFF,
            self::BAD_DEBT => 'heroicon-o-x-circle',

            self::REFUND => 'heroicon-o-arrow-path',
            self::ADJUSTMENT => 'heroicon-o-calculator',
            self::INTEREST_WAIVER => 'heroicon-o-gift-top',
        };
    }

    /**
     * Detailed description for tooltips/help.
     */
    public function getDescription(): string
    {
        return match ($this) {
            self::CREDIT_DISBURSEMENT,
            self::DISBURSEMENT => 'Dinero entregado al cliente como préstamo. Reduce el capital de trabajo.',
            self::FINANCIAL_ADJUSTMENT => 'Ajuste por operaciones de extensión, refinanciamiento o reestructuración.',

            self::PROFIT_WITHDRAWAL => 'Retiro de ganancias por parte del propietario. Reduce las utilidades acumuladas.',
            self::CAPITAL_RETURN => 'Devolución de capital a un inversionista. Reduce el patrimonio.',
            self::DIVIDEND_PAYMENT => 'Pago de dividendos a socios/accionistas.',

            self::SALARY_WAGES => 'Pago de salarios, prestaciones y seguridad social.',
            self::RENT => 'Pago de arrendamiento de oficinas o locales.',
            self::UTILITIES => 'Pago de servicios: energía, agua, internet, telefonía.',
            self::TRANSPORTATION => 'Gastos de transporte, combustible y viáticos.',
            self::MARKETING => 'Inversión en publicidad, promociones y marketing.',
            self::OFFICE_SUPPLIES => 'Compra de papelería, útiles y materiales de oficina.',
            self::PROFESSIONAL_SERVICES => 'Pago por servicios legales, contables o de consultoría.',
            self::COMMISSION => 'Comisiones pagadas a cobradores por recaudo.',
            self::BANK_FEES => 'Comisiones y cargos bancarios.',
            self::OTHER_OPERATIONAL => 'Otros gastos operativos no clasificados.',
            self::OPERATIONAL => 'Gasto operativo genérico (categoría legacy).',
            self::ADMIN_EXPENSE => 'Gasto administrativo (categoría legacy).',

            self::BAD_DEBT_PROVISION => 'Reserva contable para posibles pérdidas por cartera de difícil cobro.',
            self::BAD_DEBT_WRITEOFF => 'Reconocimiento de pérdida definitiva por cartera incobrable.',
            self::BAD_DEBT => 'Cartera incobrable (categoría legacy).',

            self::REFUND => 'Devolución de dinero a un cliente.',
            self::ADJUSTMENT => 'Ajuste contable para correcciones o regularizaciones.',
            self::INTEREST_WAIVER => 'Condonación de saldo por descuento de pronto pago o decisión comercial. No afecta caja; reduce utilidad esperada.',
        };
    }

    /**
     * Financial impact summary for UI display.
     */
    public function getFinancialImpactSummary(): string
    {
        $impacts = [];

        if ($this->affectsCash()) {
            $impacts[] = '💵 -Caja';
        }
        if ($this->reducesCapital()) {
            $impacts[] = '🏦 -Capital';
        }
        if ($this->affectsProfit()) {
            $impacts[] = '📉 -Utilidad';
        }

        return implode(' • ', $impacts) ?: 'Sin impacto directo';
    }

    // ═══════════════════════════════════════════════════════════════════════
    // OPTION ARRAYS FOR UI
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * All category values as array.
     */
    public static function values(): array
    {
        return array_column(self::cases(), 'value');
    }

    /**
     * Options for manual creation in UI (excludes system-controlled and legacy).
     */
    public static function manualOptions(): array
    {
        $options = [];
        foreach (self::manualCreationCategories() as $category) {
            $options[$category->value] = $category->getLabel();
        }

        return $options;
    }

    /**
     * Options grouped by type for better UI organization.
     */
    public static function groupedOptions(): array
    {
        return [
            'Transacciones de Capital' => [
                self::PROFIT_WITHDRAWAL->value => self::PROFIT_WITHDRAWAL->getLabel(),
                self::CAPITAL_RETURN->value => self::CAPITAL_RETURN->getLabel(),
                self::DIVIDEND_PAYMENT->value => self::DIVIDEND_PAYMENT->getLabel(),
            ],
            'Gastos Operativos' => [
                self::SALARY_WAGES->value => self::SALARY_WAGES->getLabel(),
                self::RENT->value => self::RENT->getLabel(),
                self::UTILITIES->value => self::UTILITIES->getLabel(),
                self::TRANSPORTATION->value => self::TRANSPORTATION->getLabel(),
                self::MARKETING->value => self::MARKETING->getLabel(),
                self::OFFICE_SUPPLIES->value => self::OFFICE_SUPPLIES->getLabel(),
                self::PROFESSIONAL_SERVICES->value => self::PROFESSIONAL_SERVICES->getLabel(),
                self::COMMISSION->value => self::COMMISSION->getLabel(),
                self::BANK_FEES->value => self::BANK_FEES->getLabel(),
                self::OTHER_OPERATIONAL->value => self::OTHER_OPERATIONAL->getLabel(),
            ],
            'Provisiones y Castigos' => [
                self::BAD_DEBT_PROVISION->value => self::BAD_DEBT_PROVISION->getLabel(),
                self::BAD_DEBT_WRITEOFF->value => self::BAD_DEBT_WRITEOFF->getLabel(),
            ],
            'Ajustes' => [
                self::REFUND->value => self::REFUND->getLabel(),
                self::ADJUSTMENT->value => self::ADJUSTMENT->getLabel(),
            ],
        ];
    }

    /**
     * All options for administrative views (includes legacy and system).
     */
    public static function allOptions(): array
    {
        $options = [];
        foreach (self::cases() as $category) {
            $options[$category->value] = $category->getLabel();
        }

        return $options;
    }
}
