<?php

namespace App\Filament\Resources\Manage\Partners\Infolists;

use App\Enums\DecisionAdmin;
use App\Enums\NotifStyle;
use App\Filament\Support\CheerfulNotification;
use App\Models\User;
use Filament\Infolists\Components\RepeatableEntry;
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Grid;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
use Illuminate\Database\Eloquent\Model;
use Joaopaulolndev\FilamentPdfViewer\Infolists\Components\PdfViewerEntry;

class PartnerInfolist
{
    public static function configure(Schema $schema): Schema
    {
        return $schema
            ->schema([
                Section::make(fn () => CheerfulNotification::getByKey('company.account_title'))
                    ->description(fn () => CheerfulNotification::getByKey('company.account_desc'))
                    ->schema([
                        Grid::make(3)
                            ->schema([
                                TextEntry::make('name')
                                    ->label('Nama'),

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

                                TextEntry::make('username')
                                    ->label('Nama Pengguna'),

                                TextEntry::make('is_active')
                                    ->label('Status')
                                    ->badge(),

                                TextEntry::make('email_verified_at')
                                    ->label('Email Verifikasi')
                                    ->placeholder('Akun Belum Diverifikasi')
                                    ->dateTime('l, d F Y H:i'),
                            ]),
                    ]),

                Section::make(fn () => CheerfulNotification::getByKey('company.company_title'))
                    ->description(fn () => CheerfulNotification::getByKey('company.company_desc'))
                    ->schema([
                        Grid::make(3)
                            ->schema([
                                TextEntry::make('company.name')
                                    ->label('Nama'),

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

                                TextEntry::make('company.phone_number')
                                    ->label('Nomor Telepon'),

                                TextEntry::make('company.address')
                                    ->label('Alamat'),

                                TextEntry::make('company.phone_number')
                                    ->label('No. Telepon'),

                                TextEntry::make('company.director_name')
                                    ->label('Nama Direktur'),

                                TextEntry::make('company.verificationRequest.created_at')
                                    ->label('Tanggal Pengajuan Verifikasi')
                                    ->dateTime('d F Y H:i'),

                                TextEntry::make('company.verificationRequest.latestReview.decision')
                                    ->label('Status Verifikasi')
                                    ->badge(),

                                TextEntry::make('company.verificationRequest.latestReview.created_at')
                                    ->label('Tanggal Verifikasi')
                                    ->dateTime('d F Y H:i')
                                    ->visible(fn (User $record): ?string => $record->company?->verificationRequest?->latestReview),

                                TextEntry::make('company.verificationRequest.latestReview.note')
                                    ->label('Alasan Penolakan')
                                    ->visible(fn (User $record): ?string => $record->company?->verificationRequest?->latestReview?->decision === DecisionAdmin::REJECTED),
                            ]),

                        Grid::make(3)
                            ->schema([
                                Section::make(fn () => CheerfulNotification::getByKey('company.director_nik'))
                                    ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-user' : null)
                                    ->schema([
                                        TextEntry::make('company.director_nik')
                                            ->hiddenLabel(),

                                        TextEntry::make('company.director_nik_docs')
                                            ->hiddenLabel()
                                            ->html()
                                            ->getStateUsing(function (User $record): string {
                                                $media = $record->company
                                                    ?->getMedia('companies')
                                                    ->where('custom_properties.doc_type', 'director-nik')
                                                    ->sortByDesc('created_at')
                                                    ->first();

                                                if (! $media) {
                                                    return '';
                                                }

                                                $url = $media->getUrl();
                                                $mime = $media->mime_type;

                                                if (str_contains($mime, 'image')) {
                                                    return '<img src="'.$url.'" alt="Dokumen NIK Direktur" style="max-width: 100%; height: auto; border-radius: 0.5rem;" />';
                                                }

                                                if (str_contains($mime, 'pdf')) {
                                                    return '<iframe src="'.$url.'" style="width: 100%; height: 500px; border: none;"></iframe>';
                                                }

                                                return '<a href="'.$url.'" target="_blank" class="text-primary-600 hover:text-primary-500 underline">Unduh Dokumen</a>';
                                            }),
                                    ]),

                                Section::make(fn () => CheerfulNotification::getByKey('company.establishment_deed'))
                                    ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-document-text' : null)
                                    ->schema([
                                        TextEntry::make('company.deed_incorporation')
                                            ->hiddenLabel(),

                                        self::fileEntry('company.deed_incorporation'),
                                    ]),

                                Section::make(fn () => CheerfulNotification::getByKey('company.siup_nib'))
                                    ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-document-text' : null)
                                    ->schema([
                                        TextEntry::make('company.trade_license')
                                            ->hiddenLabel(),

                                        self::fileEntry('company.trade_license'),
                                    ]),

                                Section::make(fn () => CheerfulNotification::getByKey('company.npwp'))
                                    ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-document-text' : null)
                                    ->schema([
                                        TextEntry::make('company.tax_id_number')
                                            ->hiddenLabel(),

                                        self::fileEntry('company.tax_id_number'),
                                    ]),

                                Section::make(fn () => CheerfulNotification::getByKey('company.pkp'))
                                    ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-document-text' : null)
                                    ->schema([
                                        TextEntry::make('company.taxable_enterprise')
                                            ->hiddenLabel(),

                                        self::fileEntry('company.taxable_enterprise'),
                                    ]),

                                Section::make(fn () => CheerfulNotification::getByKey('company.annual_tax'))
                                    ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-document-text' : null)
                                    ->schema([
                                        TextEntry::make('company.annual_tax_return')
                                            ->hiddenLabel(),

                                        self::fileEntry('company.annual_tax_return'),
                                    ]),

                                Section::make(fn () => CheerfulNotification::getByKey('company.domicile'))
                                    ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-document-text' : null)
                                    ->schema([
                                        TextEntry::make('company.domicile_certificate')
                                            ->hiddenLabel(),

                                        self::fileEntry('company.domicile_certificate'),
                                    ]),

                                Section::make(fn () => CheerfulNotification::getByKey('company.company_profile'))
                                    ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-document-text' : null)
                                    ->schema([
                                        TextEntry::make('company.profile')
                                            ->hiddenLabel(),

                                        self::fileEntry('company.profile'),
                                    ]),
                            ]),
                    ]),

                Section::make(fn () => CheerfulNotification::getByKey('company.media_title'))
                    ->description(fn () => CheerfulNotification::getByKey('company.media_desc'))
                    ->schema([
                        Grid::make(4)
                            ->schema([
                                TextEntry::make('company.partnerMedia.name')
                                    ->label('Nama'),

                                TextEntry::make('company.partnerMedia.link')
                                    ->label('Tautan')
                                    ->url(fn (User $record): ?string => $record->company?->partnerMedia?->link, true),

                                TextEntry::make('company.partnerMedia.type')
                                    ->label('Jenis')
                                    ->badge(),

                                TextEntry::make('company.partnerMedia.classification')
                                    ->label('Klasifikasi')
                                    ->badge(),

                                TextEntry::make('company.partnerMedia.address')
                                    ->label('Alamat')
                                    ->columnSpanFull(),
                            ]),

                        Grid::make(2)
                            ->schema([
                                Section::make(fn () => CheerfulNotification::getByKey('company.journalism_org_cert'))
                                    ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-document-text' : null)
                                    ->schema([
                                        TextEntry::make('company.partnerMedia.journalism_organization')
                                            ->hiddenLabel(),

                                        self::fileEntry('company.partnerMedia.journalism_organization', 'company.partnerMedia', 'partnerMedia'),
                                    ]),

                                Section::make(fn () => CheerfulNotification::getByKey('company.press_council_cert'))
                                    ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-document-text' : null)
                                    ->schema([
                                        TextEntry::make('company.partnerMedia.press_council_certificate')
                                            ->hiddenLabel(),

                                        self::fileEntry('company.partnerMedia.press_council_certificate', 'company.partnerMedia', 'partnerMedia'),
                                    ]),
                            ]),
                    ]),

                Section::make(fn () => CheerfulNotification::getByKey('company.journalist_title'))
                    ->description(fn () => CheerfulNotification::getByKey('company.journalist_desc'))
                    ->schema([
                        RepeatableEntry::make('company.partnerMedia.journalists')
                            ->hiddenLabel()
                            ->schema([
                                Grid::make(3)
                                    ->schema([
                                        TextEntry::make('name')
                                            ->label('Nama'),

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

                                        TextEntry::make('phone_number')
                                            ->label('No. Telepon'),
                                    ]),
                                Grid::make(2)
                                    ->schema([
                                        Section::make(fn () => CheerfulNotification::getByKey('company.press_card'))
                                            ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-identification' : null)
                                            ->schema([
                                                TextEntry::make('press_card')
                                                    ->hiddenLabel(),

                                                self::fileEntry('press_card', null, 'journalists'),
                                            ]),

                                        Section::make(fn () => CheerfulNotification::getByKey('company.ukw_cert'))
                                            ->icon(fn () => CheerfulNotification::getNotifStyle() === NotifStyle::CHEERFUL ? 'heroicon-o-document-text' : null)
                                            ->schema([
                                                TextEntry::make('ukw_certificate')
                                                    ->hiddenLabel(),

                                                self::fileEntry('ukw_certificate', null, 'journalists'),
                                            ]),
                                    ]),
                            ]),
                    ]),
            ])
            ->columns(1);
    }

    private static function fileEntry(
        string $name,
        ?string $mediaOwner = 'company',
        string $collection = 'companies'
    ): PdfViewerEntry {
        return PdfViewerEntry::make($name)
            ->hiddenLabel()
            ->getStateUsing(function (Model $record) use ($name, $mediaOwner, $collection): ?string {
                $owner = $mediaOwner ? data_get($record, $mediaOwner) : $record;

                if (! $owner) {
                    return null;
                }

                $docType = str($name)
                    ->afterLast('.')
                    ->slug('-');

                return $owner->getMedia($collection)
                    ->where('custom_properties.doc_type', (string) $docType)
                    ->sortByDesc('created_at')
                    ->first()
                    ?->getUrl();
            });
    }
}
