<?php

namespace App\Services\Billing;

use App\Models\Invoice;
use App\Models\Log;
use App\Models\Setting;

/**
 * PRC-673 — 0.00 fatura muhasebeleştirme/e-fatura istisnası.
 *
 * Bir faturanın resmi e-fatura/muhasebe entegrasyonuna (GIB/Logo/Paraşüt)
 * sevk edilip edilmeyeceğinin TEK karar noktası. Tüm Billing dispatch
 * yolları (DispatchLegalInvoiceListener, ProcessInvoiceBillingJob,
 * InvoiceBillingService) buraya sorar → hiçbir modüle özel kod yazılmaz.
 *
 * İç fatura kaydı HER koşulda korunur; bu guard yalnız resmi belge sevkini
 * (muhasebeleştirmeyi) engeller.
 */
class AccountingExclusionGuard
{
    /**
     * Fatura muhasebe/e-fatura sevkinden hariç mi?
     *
     * - `accounting_excluded` zaten true → hariç (manuel override veya önceki
     *   otomatik set).
     * - `total_amount == 0` ve `exclude_zero_total_from_einvoice` ayarı açık →
     *   bayrağı kalıcı yazar (idempotent; yalnız ilk kez audit'e düşer) ve
     *   hariç tutar. Ayar kapalıysa 0 fatura da normal sevk edilir.
     * - aksi halde dahil (normal e-faturalanır).
     */
    public function excludes(Invoice $invoice): bool
    {
        if ($invoice->accounting_excluded) {
            return true;
        }

        if ((float) $invoice->total_amount === 0.0
            && Setting::getValue('exclude_zero_total_from_einvoice', true)) {
            // Yalnız bu kolonu yaz — çağıranın modelinde beklemede olan başka
            // dirty alanları (ör. henüz kaydedilmemiş total) persist ETME.
            // Query-builder update fill()/observer'ları atlar; sealing gerekmez.
            $invoice->newQuery()->whereKey($invoice->getKey())
                ->update(['accounting_excluded' => true]);
            $invoice->setAttribute('accounting_excluded', true)
                ->syncOriginalAttribute('accounting_excluded');

            Log::create([
                'type' => Log::TYPE_SYSTEM,
                'observer' => 'AccountingExclusionGuard',
                'module' => 'Invoice',
                'method' => 'accounting_excluded_auto',
                'ip_address' => (string) (request()?->ip() ?? ''),
                'client_id' => $invoice->client_id,
                'description' => "Invoice #{$invoice->invoice_number} muhasebe-dışı işaretlendi (0.00 tutar, otomatik) — resmi e-fatura sevki atlandı",
            ]);

            return true;
        }

        return false;
    }
}
