<?php

namespace App\Filament\Pages\Accounting;

use App\Services\Accounting\Reports\TrialBalanceReport;
use App\Exports\TrialBalanceExport;
use Maatwebsite\Excel\Facades\Excel;
use Filament\Forms;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Pages\Page;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
use BezhanSalleh\FilamentShield\Traits\HasPageShield;
use Filament\Support\Icons\Heroicon;

class TrialBalance extends Page implements HasForms
{
    use InteractsWithForms;
    use HasPageShield;

    protected static string|\BackedEnum|null $navigationIcon = Heroicon::OutlinedScale;

    protected string $view = 'filament.pages.accounting.trial-balance';

    protected static ?int $navigationSort = 10;

    public ?array $data = [];
    public ?array $reportData = null;

    public static function getNavigationGroup(): ?string
    {
        return __('models.Accounting');
    }

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

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

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

    public function form(Schema $schema): Schema
    {
        return $schema
            ->schema([
                Section::make(__('filament/admin/trial_balance.معاملاتالتقرير'))
                    ->columns(2)
                    ->schema([
                        Forms\Components\DatePicker::make('from_date')
                            ->label(__('filament/admin/trial_balance.منتاريخ'))
                            ->required()
                            ->native(false)
                            ->default(now()->startOfMonth()),

                        Forms\Components\DatePicker::make('to_date')
                            ->label(__('filament/admin/trial_balance.إلىتاريخ'))
                            ->required()
                            ->native(false)
                            ->default(now()),
                    ]),
            ])
            ->statePath('data');
    }

    public function generateReport(): void
    {
        $data = $this->form->getState();

        try {
            $reportService = new TrialBalanceReport();
            $this->reportData = $reportService->generate(
                $data['from_date'],
                $data['to_date']
            );

            if (empty($this->reportData['accounts'])) {
                \Filament\Notifications\Notification::make()
                    ->warning()
                    ->title(__('filament/admin/trial_balance.تنبيه'))
                    ->body('لا توجد بيانات في الفترة المحددة')
                    ->send();
            } else {
                \Filament\Notifications\Notification::make()
                    ->success()
                    ->title(__('filament/admin/trial_balance.تمإنشاءالتقرير'))
                    ->body('تم إنشاء ميزان المراجعة بنجاح')
                    ->send();
            }
        } catch (\Exception $e) {
            \Filament\Notifications\Notification::make()
                ->danger()
                ->title(__('filament/admin/trial_balance.خطأ'))
                ->body($e->getMessage())
                ->send();
        }
    }

    public function exportPdf()
    {
        $data = $this->form->getState();

        try {
            $reportService = new TrialBalanceReport();
            $pdf = $reportService->exportPdf(
                $data['from_date'],
                $data['to_date']
            );

            return response()->streamDownload(function () use ($pdf) {
                echo $pdf;
            }, 'trial-balance-' . now()->format('Y-m-d') . '.pdf');
        } catch (\Exception $e) {
            \Filament\Notifications\Notification::make()
                ->danger()
                ->title(__('filament/admin/trial_balance.خطأ'))
                ->body($e->getMessage())
                ->send();
        }
    }

    public function exportExcel()
    {
        if (empty($this->reportData)) {
            $this->generateReport();
        }

        return Excel::download(
            new TrialBalanceExport($this->reportData, $this->data['from_date'], $this->data['to_date']),
            'trial-balance-' . now()->format('Y-m-d') . '.xlsx'
        );
    }

    protected function getFormActions(): array
    {
        return [
            \Filament\Actions\Action::make('generate')
                ->label(__('filament/admin/trial_balance.generate'))
                ->action('generateReport')
                ->color('primary'),

            \Filament\Actions\Action::make('export_excel')
                ->label(__('filament/admin/trial_balance.export_excel'))
                ->action('exportExcel')
                ->color('success')
                ->icon('heroicon-o-table-cells')
                ->visible(fn() => $this->reportData !== null && !empty($this->reportData['accounts'])),

            \Filament\Actions\Action::make('export_pdf')
                ->label(__('filament/admin/trial_balance.export_pdf'))
                ->action('exportPdf')
                ->color('danger')
                ->icon('heroicon-o-document-arrow-down')
                ->visible(fn() => $this->reportData !== null && !empty($this->reportData['accounts'])),
        ];
    }
}
