<?php

namespace App\Filament\Pages;

use Carbon\Carbon;
use App\Models\Purchase;
use App\Models\Supplier;
use Filament\Pages\Page;
use App\Models\SupplierPayment;
use Filament\Schemas\Schema;
use App\Exports\SupplierStatementExport;
use Illuminate\Contracts\View\View;
use Filament\Forms\Components\Select;
use Filament\Forms\Contracts\HasForms;
use Filament\Schemas\Components\Section;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Concerns\InteractsWithForms;
use Maatwebsite\Excel\Facades\Excel;
use Mpdf\Mpdf;

class SupplierStatementReport extends Page implements HasForms
{
    use InteractsWithForms;

    protected string $view = 'filament.pages.supplier-statement-report';

    public ?array $data = [];
    public array $statement_data = [];

    protected static string|\UnitEnum|null $navigationGroup = 'suppliers';

    protected static ?int $navigationSort = 4;

    public function getTitle(): string
    {
        return __('filament/admin/reports.supplier_statement');
    }

    public static function getNavigationLabel(): string
    {
        return __('filament/admin/reports.supplier_statement');
    }

    public static function getNavigationGroup(): ?string
    {
        return __('filament.navigation_groups.suppliers');
    }

    public function mount(): void
    {
        $this->form->fill([
            'from_date' => now()->startOfMonth(),
            'to_date' => now()->endOfMonth(),
        ]);
    }

    public function form(Schema $schema): Schema
    {
        return $schema
            ->statePath('data')
            ->components([
                Section::make(__('filament/admin/reports.filters'))
                    ->columns(3)
                    ->schema([
                        Select::make('supplier_id')
                            ->label(__('filament/admin/reports.supplier'))
                            ->placeholder(__('filament/admin/reports.select_supplier'))
                            ->options(Supplier::pluck('name', 'id'))
                            ->searchable()
                            ->preload()
                            ->required(),

                        DatePicker::make('from_date')
                            ->label(__('filament/admin/reports.from_date'))
                            ->native(false),

                        DatePicker::make('to_date')
                            ->label(__('filament/admin/reports.to_date'))
                            ->native(false),
                    ]),
            ]);
    }

    public function generateStatement(): void
    {
        $supplier_id = $this->data['supplier_id'] ?? null;

        if (!$supplier_id) {
            $this->statement_data = [];
            return;
        }

        $supplier = Supplier::findOrFail($supplier_id);
        $from_date = isset($this->data['from_date']) ? Carbon::parse($this->data['from_date']) : null;
        $to_date = isset($this->data['to_date']) ? Carbon::parse($this->data['to_date'])->endOfDay() : Carbon::now();

        // حساب الرصيد الافتتاحي
        $opening_balance_query = Purchase::where('supplier_id', $supplier_id);
        
        if ($from_date) {
            $opening_balance_query->where('created_at', '<', $from_date);
        }

        $opening_balance = $opening_balance_query->sum('remaining_amount');
        
        // جلب أوامر الشراء
        $purchases_query = Purchase::where('supplier_id', $supplier_id);
        
        if ($from_date) {
            $purchases_query->where('created_at', '>=', $from_date);
        }
        
        $purchases_query->where('created_at', '<=', $to_date);
        
        $purchases = $purchases_query->with('items')->orderBy('created_at')->get();

        // جلب المدفوعات
        $payments_query = SupplierPayment::where('supplier_id', $supplier_id)
            ->where('status', 'confirmed');
        
        if ($from_date) {
            $payments_query->where('created_at', '>=', $from_date);
        }
        
        $payments_query->where('created_at', '<=', $to_date);
        
        $payments = $payments_query->orderBy('created_at')->get();

        // بناء تفاصيل البيان
        $details = [];
        $current_balance = $opening_balance;

        foreach ($purchases as $purchase) {
            $details[] = [
                'type' => 'purchase',
                'date' => $purchase->created_at->format('Y-m-d'),
                'invoice_number' => $purchase->id,
                'description' => 'أمر شراء',
                'subtotal' => $purchase->subtotal,
                'discount' => $purchase->discount_amount,
                'tax' => $purchase->tax_amount,
                'total' => $purchase->total_amount,
                'paid' => $purchase->paid_amount,
                'remaining' => $purchase->remaining_amount,
                'items' => $purchase->items,
                'balance' => $current_balance + $purchase->total_amount,
                'payment_status' => $purchase->payment_status,
            ];
            $current_balance += $purchase->total_amount;
        }

        foreach ($payments as $payment) {
            $details[] = [
                'type' => 'payment',
                'date' => $payment->created_at->format('Y-m-d'),
                'description' => 'سداد للمورد',
                'amount' => -$payment->amount,
                'payment_method' => $payment->payment_method,
                'balance' => $current_balance - $payment->amount,
            ];
            $current_balance -= $payment->amount;
        }

        usort($details, function ($a, $b) {
            return strtotime($a['date']) - strtotime($b['date']);
        });

        $this->statement_data = [
            'supplier' => $supplier,
            'from_date' => $from_date?->format('Y-m-d'),
            'to_date' => $to_date->format('Y-m-d'),
            'opening_balance' => $opening_balance,
            'closing_balance' => $current_balance,
            'total_purchases' => $purchases->sum('total_amount'),
            'total_paid' => $payments->sum('amount'),
            'details' => $details,
        ];
    }

    public function exportExcel()
    {
        if (empty($this->statement_data)) {
            return;
        }

        $supplier = $this->statement_data['supplier'];
        $fileName = 'supplier_statement_' . $supplier->id . '_' . now()->format('Y-m-d') . '.xlsx';

        return Excel::download(
            new SupplierStatementExport(
                $this->statement_data,
                $supplier,
                $this->statement_data['from_date'],
                $this->statement_data['to_date']
            ),
            $fileName
        );
    }

    public function exportPdf()
    {
        if (empty($this->statement_data)) {
            return;
        }

        $html = view('reports.pdf.supplier-statement', [
            'data' => $this->statement_data,
        ])->render();

        $mpdf = new Mpdf([
            'mode' => 'utf-8',
            'format' => 'A4',
            'orientation' => 'L',
            'margin_left' => 10,
            'margin_right' => 10,
            'margin_top' => 10,
            'margin_bottom' => 10,
            'default_font' => 'dejavusans'
        ]);

        $mpdf->autoScriptToLang = true;
        $mpdf->autoLangToFont = true;
        $mpdf->SetDirectionality('rtl');
        $mpdf->WriteHTML($html);

        $supplier = $this->statement_data['supplier'];
        $fileName = 'supplier_statement_' . $supplier->id . '_' . now()->format('Y-m-d') . '.pdf';

        return response()->streamDownload(function () use ($mpdf) {
            echo $mpdf->Output('', 'S');
        }, $fileName);
    }
}
