<?php

declare(strict_types=1);

namespace App\Shared\Support;

final class ReferenceLabel
{
    private static function customLabel(string $key, string $category = 'statement_doc_type'): ?string
    {
        $key = strtoupper(trim($key));
        if ($key === '') {
            return null;
        }
        try {
            if (function_exists('db')) {
                $label = \App\Services\LabelDefinitionService::translate(\db(), $key, $category);
                return $label !== str_replace(['_', '-'], ' ', $key) ? $label : null;
            }
        } catch (\Throwable $e) {
            return null;
        }
        return null;
    }

    public static function referenceType(string $type): string
    {
        $key = strtoupper(trim($type));
        $custom = self::customLabel($key, 'statement_doc_type');
        if ($custom !== null) {
            return $custom;
        }
        $map = [
            'CUSTOMER_RECEIPT' => 'سند قبض',
            'RCPT' => 'سند قبض',
            'RECEIPT' => 'سند قبض',
            'CASH_PAYMENT' => 'سند صرف',
            'PAY' => 'سند صرف',
            'PAYMENT' => 'سداد',
            'SUPPLIER_PAYMENT' => 'سداد مورد',
            'SALES_RCPT' => 'تحصيل على فاتورة بيع',
            'SALES_RECEIPT' => 'تحصيل على فاتورة بيع',
            'SALES_INV' => 'فاتورة بيع',
            'SALES_INVOICE' => 'فاتورة بيع',
            'SALES_RET' => 'مرتجع بيع',
            'SALES_RETURN' => 'مرتجع بيع',
            'PURCHASE_INV' => 'فاتورة شراء',
            'PURCHASE_INVOICE' => 'فاتورة شراء',
            'PURCHASE_RET' => 'مرتجع شراء',
            'PURCHASE_RETURN' => 'مرتجع شراء',
            'CHECK_RECV' => 'استلام شيك',
            'CHECK_RECEIVE' => 'استلام شيك',
            'CHECK_END' => 'تظهير شيك',
            'CHECK_ENDORSE' => 'تظهير شيك',
            'CHECK_CASH' => 'صرف شيك',
            'CHECK_CASH_SETTLEMENT' => 'صرف شيك',
            'CHECK_RET' => 'إرجاع شيك',
            'CHECK_RETURN' => 'إرجاع شيك',
            'DEPOSIT' => 'إيداع',
            'WITHDRAW' => 'سحب',
            'CASH_TO_BANK' => 'تحويل من خزنة إلى بنك',
            'BANK_TO_CASH' => 'تحويل من بنك إلى خزنة',
            'TRANSFER' => 'تحويل',
            'ADJUST' => 'تسوية',
            'OPENING' => 'رصيد افتتاحي',
        ];

        return $map[$key] ?? ($type !== '' ? $type : 'حركة');
    }

    public static function humanReference(string $type, $id = null, string $docNo = ''): string
    {
        $label = self::referenceType($type);
        $docNo = trim($docNo);
        if ($docNo !== '') {
            return $label . ' رقم ' . $docNo;
        }

        $id = (int) $id;
        return $id > 0 ? ($label . ' رقم ' . $id) : $label;
    }

    public static function ledgerDocType(string $docType): string
    {
        $key = strtoupper(trim($docType));
        $custom = self::customLabel($key, 'statement_doc_type');
        if ($custom !== null) {
            return $custom;
        }
        $map = [
            'SALES_INV' => 'فاتورة بيع',
            'RCPT' => 'سند قبض',
            'PAY' => 'سند صرف',
            'PAYMENT' => 'سداد',
            'SUPPLIER_PAYMENT' => 'سداد مورد',
            'SALES_RCPT' => 'تحصيل على فاتورة بيع',
            'SALES_RECEIPT' => 'تحصيل على فاتورة بيع',
            'PURCHASE_INV' => 'فاتورة شراء',
            'PURCHASE_PAY' => 'سداد على فاتورة شراء',
            'PURCHASE_RET' => 'مرتجع شراء',
            'SALES_RET' => 'مرتجع بيع',
            'OPENING' => 'رصيد افتتاحي',
            'CHECK_RECV' => 'استلام شيك',
            'CHECK_END' => 'تظهير شيك',
            'CHECK_CASH' => 'صرف شيك',
            'CHECK_RET' => 'إرجاع شيك',
        ];
        return $map[$key] ?? ($docType !== '' ? $docType : 'حركة');
    }

    public static function ledgerReference(array $row): string
    {
        $label = self::ledgerDocType((string) ($row['doc_type'] ?? ''));
        $no = trim((string) ($row['doc_no'] ?? ''));
        if ($no !== '') {
            return $label . ' رقم ' . $no;
        }

        $id = (int) ($row['doc_id'] ?? 0);
        return $id > 0 ? ($label . ' رقم ' . $id) : $label;
    }

    public static function ledgerEntryDescription(array $row): string
    {
        $notes = trim((string) ($row['notes'] ?? ''));
        if ($notes !== '') {
            return $notes;
        }

        return self::ledgerReference($row);
    }

    public static function canEndorseCheck(array $check): bool
    {
        return in_array(strtolower((string) ($check['current_status'] ?? '')), ['received'], true);
    }

    public static function canReturnCheck(array $check): bool
    {
        return in_array(strtolower((string) ($check['current_status'] ?? '')), ['received', 'endorsed'], true);
    }

    public static function canCashSettleCheck(array $check): bool
    {
        return in_array(strtolower((string) ($check['current_status'] ?? '')), ['received', 'endorsed'], true);
    }

    public static function canReplaceCheck(array $check): bool
    {
        return in_array(strtolower((string) ($check['current_status'] ?? '')), ['returned'], true);
    }
}
