<?php

declare(strict_types=1);

namespace App\Filament\Resources\SubscriptionRequests\Pages;

use App\Filament\Resources\SubscriptionRequests\SubscriptionRequestResource;
use App\Models\SubscriptionRequest;
use App\Services\SubscriptionActivationService;
use Filament\Actions\Action;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\ViewRecord;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
use Filament\Support\Enums\FontWeight;
use Illuminate\Support\Facades\Auth;

class ViewSubscriptionRequest extends ViewRecord
{
    protected static string $resource = SubscriptionRequestResource::class;

    public function infolist(Schema $schema): Schema
    {
        return $schema
            ->columns(1)
            ->components([
                Section::make('Información de la Solicitud')
                    ->icon('heroicon-o-document-text')
                    ->columns(3)
                    ->schema([
                        TextEntry::make('id')
                            ->label('ID'),

                        TextEntry::make('request_type_label')
                            ->label('Tipo de Solicitud')
                            ->badge()
                            ->color('info'),

                        TextEntry::make('status')
                            ->label('Estado')
                            ->badge()
                            ->formatStateUsing(fn ($record) => $record->status_label)
                            ->color(fn ($record) => $record->status_color),

                        TextEntry::make('current_value')
                            ->label('Valor Actual')
                            ->placeholder('N/A'),

                        TextEntry::make('requested_value')
                            ->label('Valor Solicitado')
                            ->placeholder('N/A')
                            ->weight(FontWeight::Bold),

                        TextEntry::make('requestedPlan.name')
                            ->label('Plan Solicitado')
                            ->placeholder('N/A')
                            ->badge()
                            ->color('success'),

                        TextEntry::make('priority_label')
                            ->label('Prioridad')
                            ->badge()
                            ->color(fn ($record) => $record->priority_color),

                        TextEntry::make('created_at')
                            ->label('Fecha de Solicitud')
                            ->dateTime('d/m/Y H:i'),

                        TextEntry::make('expires_at')
                            ->label('Expira')
                            ->dateTime('d/m/Y')
                            ->placeholder('Sin expiración'),
                    ]),

                Section::make('Empresa')
                    ->icon('heroicon-o-building-office')
                    ->columns(3)
                    ->schema([
                        TextEntry::make('company.name')
                            ->label('Nombre'),

                        TextEntry::make('company.business_name')
                            ->label('Nombre Comercial')
                            ->placeholder('-'),

                        TextEntry::make('company.email')
                            ->label('Email'),

                        TextEntry::make('requestedBy.name')
                            ->label('Solicitado por'),

                        TextEntry::make('requestedBy.email')
                            ->label('Email del Solicitante'),

                        TextEntry::make('subscription.plan.name')
                            ->label('Plan Actual')
                            ->placeholder('Sin plan'),
                    ]),

                Section::make('Comentarios del Solicitante')
                    ->icon('heroicon-o-chat-bubble-left-right')
                    ->schema([
                        TextEntry::make('comments')
                            ->label('')
                            ->hiddenLabel()
                            ->prose()
                            ->markdown(),
                    ]),

                Section::make('Revisión')
                    ->icon('heroicon-o-clipboard-document-check')
                    ->columns(2)
                    ->visible(fn ($record) => $record->reviewed_at !== null)
                    ->schema([
                        TextEntry::make('reviewedBy.name')
                            ->label('Revisado por'),

                        TextEntry::make('reviewed_at')
                            ->label('Fecha de Revisión')
                            ->dateTime('d/m/Y H:i'),

                        TextEntry::make('admin_notes')
                            ->label('Notas del Admin')
                            ->columnSpanFull()
                            ->placeholder('Sin notas'),
                    ]),

                Section::make('Implementación')
                    ->icon('heroicon-o-check-badge')
                    ->columns(2)
                    ->visible(fn ($record) => $record->implemented_at !== null)
                    ->schema([
                        TextEntry::make('implementedBy.name')
                            ->label('Implementado por'),

                        TextEntry::make('implemented_at')
                            ->label('Fecha de Implementación')
                            ->dateTime('d/m/Y H:i'),

                        TextEntry::make('implementation_details')
                            ->label('Detalles')
                            ->columnSpanFull()
                            ->formatStateUsing(fn ($state) => $state['notes'] ?? '-'),
                    ]),
            ]);
    }

    protected function getHeaderActions(): array
    {
        return [
            Action::make('approve')
                ->label('Aprobar')
                ->icon('heroicon-o-check-circle')
                ->color('success')
                ->requiresConfirmation()
                ->modalHeading('Aprobar y activar suscripción')
                ->form([
                    // Pago manual/offline (#165): registra cuánto pagó la empresa y la
                    // referencia. Opcional — informativo, no cobra nada.
                    TextInput::make('amount_paid')
                        ->label('Monto pagado (COP)')
                        ->helperText('Opcional. Registro manual del pago recibido por transferencia/consignación.')
                        ->numeric()
                        ->minValue(0)
                        ->prefix('$'),
                    TextInput::make('payment_reference')
                        ->label('Referencia de pago')
                        ->maxLength(100),
                    Textarea::make('admin_notes')
                        ->label('Notas (opcional)')
                        ->rows(3),
                ])
                ->action(function (array $data): void {
                    // Aprobar ACTIVA la suscripción de verdad (#163): antes solo
                    // cambiaba el estado de la solicitud y había que editar la
                    // Subscription a mano. El servicio aprueba + activa + marca
                    // implementada en una transacción, y registra el pago manual (#165).
                    $request = $this->record;
                    if ($request instanceof SubscriptionRequest) {
                        app(SubscriptionActivationService::class)
                            ->approveAndActivate($request, Auth::user(), $data['admin_notes'] ?? null, $data['amount_paid'] ?? null, $data['payment_reference'] ?? null);
                    }

                    Notification::make()
                        ->title('Solicitud aprobada y suscripción activada')
                        ->success()
                        ->send();

                    $this->redirect(SubscriptionRequestResource::getUrl('view', ['record' => $this->record]));
                })
                ->visible(fn () => $this->record->canBeReviewed()),

            Action::make('reject')
                ->label('Rechazar')
                ->icon('heroicon-o-x-circle')
                ->color('danger')
                ->requiresConfirmation()
                ->modalHeading('Rechazar Solicitud')
                ->form([
                    Textarea::make('admin_notes')
                        ->label('Motivo del Rechazo')
                        ->required()
                        ->rows(3),
                ])
                ->action(function (array $data): void {
                    $this->record->reject(Auth::id(), $data['admin_notes']);

                    Notification::make()
                        ->title('Solicitud rechazada')
                        ->warning()
                        ->send();

                    $this->redirect(SubscriptionRequestResource::getUrl('view', ['record' => $this->record]));
                })
                ->visible(fn () => $this->record->canBeReviewed()),

            Action::make('implement')
                ->label('Marcar Implementado')
                ->icon('heroicon-o-check-badge')
                ->color('success')
                ->requiresConfirmation()
                ->modalHeading('Confirmar Implementación')
                ->form([
                    TextInput::make('amount_paid')
                        ->label('Monto pagado (COP)')
                        ->helperText('Opcional. Registro manual del pago recibido.')
                        ->numeric()
                        ->minValue(0)
                        ->prefix('$'),
                    TextInput::make('payment_reference')
                        ->label('Referencia de pago')
                        ->maxLength(100),
                    Textarea::make('implementation_notes')
                        ->label('Detalles')
                        ->rows(3),
                ])
                ->action(function (array $data): void {
                    // "Marcar Implementado" también ACTIVA la suscripción (#163):
                    // antes solo cambiaba el status → la empresa seguía bloqueada.
                    $request = $this->record;
                    if ($request instanceof SubscriptionRequest) {
                        app(SubscriptionActivationService::class)
                            ->implementAndActivate($request, Auth::user(), $data['implementation_notes'] ?? null, $data['amount_paid'] ?? null, $data['payment_reference'] ?? null);
                    }

                    Notification::make()
                        ->title('Implementación confirmada y suscripción activada')
                        ->success()
                        ->send();

                    $this->redirect(SubscriptionRequestResource::getUrl('view', ['record' => $this->record]));
                })
                ->visible(fn () => $this->record->canBeImplemented()),
        ];
    }
}
