<?php

namespace App\Providers;

use App\Models\InvoiceBilling;
use App\Services\InvoiceBillingService;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class InvoiceBillingServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     */
    public function register(): void
    {
        // Faturalandırma servis sınıfını singleton olarak kaydet
        $this->app->singleton(InvoiceBillingService::class, function ($app) {
            return new InvoiceBillingService;
        });

        // Faturalandırma modüllerini container'a kaydet
        $this->app->bind('invoice.billing.modules', function ($app) {
            return InvoiceBilling::active()->get();
        });

        // Varsayılan faturalandırma modülünü kaydet
        $this->app->bind('invoice.billing.default', function ($app) {
            $defaultModule = setting('billing_default_module', 'gib');

            return InvoiceBilling::where('name', $defaultModule)->first();
        });
    }

    /**
     * Bootstrap services.
     */
    public function boot(): void
    {
        // View composer'ları kaydet
        $this->registerViewComposers();

        // Blade directive'lerini kaydet
        $this->registerBladeDirectives();

        // PRC-889 — legacy "kafadan giden" faturalandırma tetikleri KALDIRILDI.
        // Eskiden burada Invoice::created + Invoice::updated→paid Eloquent
        // event'leri billing_default_module'a doğrudan iş üretiyordu. Bu path,
        // PRC-75 rota (DispatchLegalInvoiceListener + kural motoru + kuyruk)
        // ile aynı anda çalışıp vergi dairesine ÇİFT e-fatura riski
        // doğuruyordu. Yasal fatura sevkinin TEK kanonik yolu artık
        // event-driven PRC-75 rotasıdır (App\Listeners\DispatchLegalInvoiceListener).
    }

    /**
     * View composer'ları kaydet
     */
    protected function registerViewComposers(): void
    {
        // Tüm view'lara faturalandırma modüllerini ekle.
        // PRC-1127 — try/catch: fresh (pre-migrate) DB'de `invoice_billings` /
        // `settings` tabloları henüz yok. `'*'` composer /install sihirbazının
        // ilk sayfasında da fire ettiği için guard'sız query 500 veriyordu
        // (non-Docker kurulum yolları migrate'i /install adım-5'te koşar).
        // AppServiceProvider::shareCompanySettings ile aynı desen.
        View::composer('*', function ($view) {
            try {
                $view->with('billingModules', InvoiceBilling::active()->get());
                $view->with('defaultBillingModule', setting('billing_default_module', 'gib'));
            } catch (\Throwable $e) {
                $view->with('billingModules', collect());
                $view->with('defaultBillingModule', 'gib');
            }
        });

        // Admin layout'a faturalandırma bilgilerini ekle (aynı fresh-DB guard'ı —
        // yarı-migrate durumlarda admin layout 500 vermesin).
        View::composer('admin.layouts.app', function ($view) {
            try {
                $view->with('billingModules', InvoiceBilling::active()->get());
                $view->with('billingSettings', [
                    'enable_automatic' => setting('billing_enable_automatic', false),
                    'default_module' => setting('billing_default_module', 'gib'),
                    'auto_process_delay' => setting('billing_auto_process_delay', 5),
                    'retry_failed_jobs' => setting('billing_retry_failed_jobs', true),
                    'max_retry_attempts' => setting('billing_max_retry_attempts', 3),
                    'notify_on_failure' => setting('billing_notify_on_failure', true),
                    'failure_notification_email' => setting('billing_failure_notification_email', ''),
                ]);
            } catch (\Throwable $e) {
                $view->with('billingModules', collect());
                $view->with('billingSettings', []);
            }
        });
    }

    /**
     * Blade directive'lerini kaydet
     */
    protected function registerBladeDirectives(): void
    {
        // Faturalandırma modülü aktif mi kontrolü
        Blade::if('billingModuleActive', function ($moduleName) {
            return InvoiceBilling::where('name', $moduleName)->where('is_active', true)->exists();
        });

        // Otomatik faturalandırma aktif mi kontrolü
        Blade::if('automaticBillingEnabled', function () {
            return setting('billing_enable_automatic', false);
        });

        // Faturalandırma modülü test edilebilir mi kontrolü
        Blade::if('billingModuleTestable', function ($moduleName) {
            $module = InvoiceBilling::where('name', $moduleName)->first();

            return $module && $module->is_active && ! empty($module->settings);
        });
    }

}
