<?php

namespace App\Filament\Resources\Contracts;

use App\Filament\Resources\Contracts\Pages\CreateContract;
use App\Filament\Resources\Contracts\Pages\EditContract;
use App\Filament\Resources\Contracts\Pages\ListContracts;
use App\Models\Contract;
use App\Models\Company;
use App\Models\Service;
use BackedEnum;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Table;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Repeater;
use Filament\Schemas\Components\Section;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\BadgeColumn;
use Filament\Actions\EditAction;
use Filament\Actions\DeleteAction;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;

class ContractResource extends Resource
{
    protected static ?string $model = Contract::class;

    protected static ?int $navigationSort = 1;
    protected static ?string $navigationLabel = 'العقود';
    protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedDocumentText;

    public static function getNavigationGroup(): string|null
    {
        return 'العقود والتعاقدات';
    }

    public static function getNavigationBadge(): ?string
    {
        return static::getModel()::count();
    }

    public static function form(Schema $schema): Schema
    {
        return $schema
            ->components([
                Section::make('معلومات العقد')
                    ->schema([
                        Select::make('company_id')
                            ->label('الشركة')
                            ->options(Company::query()->where('is_active', true)->pluck('name', 'id')->toArray())
                            ->searchable()
                            ->required()
                            ->preload()
                            ->reactive()
                            ->createOptionForm([
                                Section::make('بيانات الشركة')
                                    ->schema([
                                        TextInput::make('name')
                                            ->label('الاسم')
                                            ->required()
                                            ->maxLength(255)
                                            ->columnSpanFull(),
                                        TextInput::make('contact_person')
                                            ->label('الشخص المسؤول')
                                            ->maxLength(255),
                                        TextInput::make('phone')
                                            ->label('الهاتف')
                                            ->tel()
                                            ->maxLength(20),
                                        TextInput::make('email')
                                            ->label('البريد الإلكتروني')
                                            ->email()
                                            ->maxLength(255),
                                        Textarea::make('address')
                                            ->label('العنوان')
                                            ->rows(2)
                                            ->columnSpanFull(),
                                    ])
                                    ->columns(2)
                            ])
                            ->createOptionUsing(function ($data) {
                                return Company::create($data)->id;
                            })
                            ->createOptionModalHeading('إضافة شركة جديدة'),

                        TextInput::make('contract_no')
                            ->label('رقم العقد')
                            ->disabled()
                            ->dehydrated(false)
                            ->placeholder('يولد تلقائياً'),

                        DatePicker::make('start_date')
                            ->label('تاريخ البداية')
                            ->required()
                            ->native(false)
                            ->displayFormat('Y-m-d'),

                        DatePicker::make('end_date')
                            ->label('تاريخ النهاية')
                            ->required()
                            ->native(false)
                            ->displayFormat('Y-m-d')
                            ->after('start_date'),

                        Select::make('status')
                            ->label('الحالة')
                            ->options([
                                'draft' => 'مسودة',
                                'active' => 'نشط',
                                'completed' => 'مكتمل',
                                'cancelled' => 'ملغي',
                            ])
                            ->default('draft')
                            ->required()
                            ->preload(),

                        TextInput::make('total_value')
                            ->label('القيمة الإجمالية')
                            ->numeric()
                            ->prefix('EGP')
                            ->disabled()
                            ->dehydrated(false)
                            ->default(0),
                    ])->columns(2),

                Section::make('تفاصيل إضافية')
                    ->schema([
                        Textarea::make('description')
                            ->label('الوصف')
                            ->maxLength(1000)
                            ->columnSpanFull(),

                        Textarea::make('notes')
                            ->label('ملاحظات')
                            ->maxLength(1000)
                            ->columnSpanFull(),
                    ]),

                Section::make('بنود العقد')
                    ->schema([
                        Repeater::make('items')
                            ->relationship('items')
                            ->schema([
                                Select::make('service_id')
                                    ->label('نوع الخدمة')
                                    ->options(Service::query()->where('is_active', true)->pluck('name', 'id')->toArray())
                                    ->searchable()
                                    ->required()
                                    ->preload()
                                    ->reactive()
                                    ->afterStateUpdated(function ($state, callable $set) {
                                        if ($state) {
                                            $service = Service::find($state);
                                            if ($service) {
                                                $set('unit_type', $service->unit_type);
                                            }
                                        }
                                    })
                                    ->createOptionForm([
                                        Section::make('بيانات الخدمة')
                                            ->schema([
                                                TextInput::make('name')
                                                    ->label('الاسم')
                                                    ->required()
                                                    ->maxLength(255)
                                                    ->columnSpanFull(),
                                                TextInput::make('code')
                                                    ->label('الرمز')
                                                    ->maxLength(50),
                                                Select::make('unit_type')
                                                    ->label('وحدة القياس')
                                                    ->options([
                                                        'hour' => 'ساعة',
                                                        'day' => 'يوم',
                                                        'trip' => 'رحلة',
                                                        'piece' => 'قطعة',
                                                    ])
                                                    ->preload(),
                                                Textarea::make('description')
                                                    ->label('الوصف')
                                                    ->rows(2)
                                                    ->columnSpanFull(),
                                            ])
                                            ->columns(2)
                                    ])
                                    ->createOptionUsing(function ($data) {
                                        return Service::create($data)->id;
                                    })
                                    ->createOptionModalHeading('إضافة خدمة جديدة')
                                    ->columnSpan(2),

                                TextInput::make('machine_type')
                                    ->label('نوع المعدة')
                                    ->maxLength(255)
                                    ->columnSpan(2),

                                TextInput::make('agreed_qty')
                                    ->label('الكمية المتفق عليها')
                                    ->numeric()
                                    ->required()
                                    ->default(0)
                                    ->reactive()
                                    ->afterStateUpdated(function ($state, callable $get, callable $set) {
                                        $qty = (float) $state;
                                        $price = (float) $get('unit_price');
                                        $set('total_amount', $qty * $price);
                                    }),

                                TextInput::make('unit_price')
                                    ->label('سعر الوحدة')
                                    ->numeric()
                                    ->required()
                                    ->default(0)
                                    ->prefix('EGP')
                                    ->reactive()
                                    ->afterStateUpdated(function ($state, callable $get, callable $set) {
                                        $qty = (float) $get('agreed_qty');
                                        $price = (float) $state;
                                        $set('total_amount', $qty * $price);
                                    }),

                                TextInput::make('total_amount')
                                    ->label('الإجمالي')
                                    ->numeric()
                                    ->disabled()
                                    ->dehydrated(true)
                                    ->prefix('EGP')
                                    ->default(0),

                                Textarea::make('notes')
                                    ->label('ملاحظات')
                                    ->maxLength(500)
                                    ->columnSpanFull(),
                            ])
                            ->columns(6)
                            ->defaultItems(1)
                            ->reorderable(false)
                            ->collapsible()
                            ->itemLabel(fn (array $state): ?string => 
                                isset($state['service_id']) 
                                    ? Service::find($state['service_id'])?->name 
                                    : 'بند جديد'
                            )
                            ->addActionLabel('إضافة بند')
                            ->columnSpanFull(),
                    ]),
            ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->applyTenantScope()
            ->columns([
                TextColumn::make('contract_no')
                    ->label('رقم العقد')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('company.name')
                    ->label('الشركة')
                    ->searchable()
                    ->sortable(),
                
                TextColumn::make('start_date')
                    ->label('تاريخ البداية')
                    ->date('Y-m-d')
                    ->sortable(),
                
                TextColumn::make('end_date')
                    ->label('تاريخ النهاية')
                    ->date('Y-m-d')
                    ->sortable(),
                
                TextColumn::make('total_value')
                    ->label('القيمة الإجمالية')
                    ->money('EGP')
                    ->sortable()
                    ->summarize([
                        \Filament\Tables\Columns\Summarizers\Sum::make()
                            ->money('EGP')
                            ->label('الإجمالي'),
                    ]),
                
                BadgeColumn::make('status')
                    ->label('الحالة')
                    ->formatStateUsing(function ($state) {
                        $statuses = [
                            'draft' => 'مسودة',
                            'active' => 'نشط',
                            'completed' => 'مكتمل',
                            'cancelled' => 'ملغي',
                        ];
                        return $statuses[$state] ?? $state;
                    })
                    ->colors([
                        'secondary' => 'draft',
                        'success' => 'active',
                        'primary' => 'completed',
                        'danger' => 'cancelled',
                    ]),
                
                TextColumn::make('items_count')
                    ->label('عدد البنود')
                    ->counts('items')
                    ->sortable(),
            ])
            ->recordActions([
                EditAction::make(),
                DeleteAction::make()->requiresConfirmation(),
            ])
            ->toolbarActions([
                BulkActionGroup::make([
                    DeleteBulkAction::make()->requiresConfirmation(),
                ]),
            ])
            ->defaultSort('created_at', 'desc');
    }

    public static function getPages(): array
    {
        return [
            'index' => ListContracts::route('/'),
            'create' => CreateContract::route('/create'),
            'edit' => EditContract::route('/{record}/edit'),
        ];
    }

    public static function canViewAny(): bool
    {
        return true;
    }

    public static function canCreate(): bool
    {
        return true;
    }

    public static function canEdit($record): bool
    {
        return true;
    }

    public static function canDelete($record): bool
    {
        return true;
    }

    public static function canDeleteAny(): bool
    {
        return true;
    }
}
