<?php

namespace App\Filament\Resources\KartuKeluargaResource\Pages;

use App\Filament\Resources\KartuKeluargaResource;
use Filament\Actions;
use Filament\Resources\Pages\Page;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\Placeholder;
use App\Models\KartuKeluarga; // <--- PENTING: Import model KartuKeluarga
use Filament\Forms\Form;
use Filament\Notifications\Notification;
use Illuminate\Database\Eloquent\Model;
use App\Models\Penduduk; // Pastikan model Penduduk diimpor
use Filament\Forms\Components\Grid;
use Filament\Forms\Set;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\HtmlString;

class ManageAnggotaKeluarga extends Page
{
    protected static string $resource = KartuKeluargaResource::class;

    protected static string $view = 'filament.resources.kartu-keluarga-resource.pages.manage-anggota-keluarga';

    // Tipe hint yang benar untuk properti $record
    public ?KartuKeluarga $record = null; // Ganti $record = null; menjadi ?KartuKeluarga $record = null;

    public ?array $data = []; // Untuk menyimpan data form

    public function mount(): void
    {
        // Manually resolve the record
         if (!$this->record) {
            Notification::make()
                ->title('Error: Kartu Keluarga tidak ditemukan atau tidak dapat dimuat.')
                ->danger()
                ->send();
            return; // Hentikan eksekusi jika record tidak ada
        }

        // Log($this->record);

        // Inisialisasi data form dari Kartu Keluarga yang ada
        $this->form->fill([
            'nomor_kk_display' => $this->record->nomor_kk ?? '-',
            'kepala_keluarga_display' => $this->record->kepala_keluarga ?? '-',
            'alamat_display' => $this->record->dusun->nama . ', RT ' . $this->record->rt . ' RW ' . $this->record->rw . ' (' . $this->record->kecamatan . ' - ' . $this->record->kabupaten . ')',
            'anggota' => $this->record->anggotaKeluarga->map(function ($anggotaKK) {
                $penduduk = $anggotaKK->penduduk;
                return [
                    'id' => $anggotaKK->id, // PENTING: Sertakan ID dari record AnggotaKartuKeluarga untuk update/delete oleh Repeater
                    'penduduk_id' => $penduduk->id,
                    'nik' => $penduduk->nik,
                    'nama' => $penduduk->nama,
                    'jenis_kelamin' => $penduduk->jenis_kelamin,
                    'hubungan' => $anggotaKK->hubungan, // Ganti ke 'hubungan' sesuai dengan model AnggotaKartuKeluarga
                ];
            })->toArray(),
        ]);
    }

    protected function getFormSchema(): array
    {
        $kepalaKeluargaId = $this->record->kepala_keluarga_id;
        return [
            Grid::make(2)
                ->schema([
                    TextInput::make('nomor_kk_display')
                        ->label('No KK')
                        ->disabled(),
                        // ->columnSpan(1),
                    TextInput::make('kepala_keluarga_display')
                        ->label('Kepala Keluarga') // Label kosong karena sudah digabung
                        ->disabled()
                        // ->columnSpan(1),
                ]),
            TextInput::make('alamat_display')
                ->label('Alamat')
                ->disabled(),
        
            Placeholder::make('infoBox')
                ->label('')
                ->content(function ($record) {
                    if (!$record) return null;

                    $anggota = $record->anggotaKeluarga()->with('penduduk')->get();

                    $jumlahAnak = $anggota->where('hubungan', 'anak')->count();
                    $jumlahAnggota = $anggota->count();

                    $ayah = $anggota->firstWhere('hubungan', 'ayah');
                    $ibu = $anggota->firstWhere('hubungan', 'ibu');

                    $namaAyah = $ayah?->penduduk?->nama ?? '-';
                    $namaIbu = $ibu?->penduduk?->nama ?? '-';

                    $daftarAnak = $anggota->where('hubungan', 'anak')
                        ->map(function ($anak) use ($namaAyah, $namaIbu) {
                            $namaAnak = $anak->penduduk->nama ?? '(Nama tidak tersedia)';
                            return "- {$namaAnak} (Anak dari {$namaAyah} & {$namaIbu})";
                        })->implode('<br>');

                    $dusun = optional($record->dusun)->nama ?? '-';
                    $subDusun = optional($record->subDusun)->nama ?? '-';
                    $rt = $record->rt ?? '-';
                    $rw = $record->rw ?? '-';

                    return new HtmlString('
                        <div style="padding: 1rem; background-color: #ffffff; border-radius: 0.5rem;">
                            <strong>Petunjuk:</strong> Pastikan anggota keluarga yang ditambahkan bukan kepala keluarga.<br>
                            Anda bisa menambahkan istri, anak, menantu, atau lainnya sesuai struktur keluarga yang benar.<br><br>

                            <strong>Jumlah anggota:</strong> ' . $jumlahAnggota . '<br>
                            <strong>Jumlah anak:</strong> ' . $jumlahAnak . '<br>
                            <strong>Ayah:</strong> ' . $namaAyah . '<br>
                            <strong>Ibu:</strong> ' . $namaIbu . '<br><br>

                            <strong>Daftar Anak:</strong><br>' . ($daftarAnak ?: 'Belum ada data anak.') . '<br><br>

                            <strong>Dusun:</strong> ' . $dusun . ' / ' . $subDusun . '<br>
                            <strong>RT / RW:</strong> ' . $rt . ' / ' . $rw . '
                        </div>
                    ');
                })
                ->columnSpanFull(),
            Repeater::make('anggota')
                ->relationship('anggotaKeluarga') // Asumsi relasi hasMany atau belongsToMany
                ->label('Anggota')
                ->schema([
                    Select::make('penduduk_id')
                        ->label('Penduduk')
                        ->options(
                            Penduduk::where('id', '!=', $kepalaKeluargaId)
                                ->where('is_ignore', '=', false)
                                ->where('dusun_id', Auth::user()->dusun_id)
                                ->get()
                                ->mapWithKeys(fn ($item) => [
                                    $item->id => "{$item->nama} - NIK : " . ($item->nik ?? 'N/A')
                                ])
                        )
                        ->searchable()
                        ->required()
                        ->distinct()
                        ->live()
                        ->afterStateUpdated(function ($state, Set $set) {
                            $penduduk = Penduduk::find($state);
                            if ($penduduk) {
                                $set('nik', $penduduk->nik);
                                $set('nama', $penduduk->nama);
                                $set('jenis_kelamin', $penduduk->jenis_kelamin);
                            }
                        })
                        ->distinct()
                        ->disableOptionsWhenSelectedInSiblingRepeaterItems(),
                    Select::make('hubungan')
                        ->label('Hub Keluarga')
                        ->options([
                            'kepala_keluarga' => 'Kepala Keluarga',
                            'istri' => 'Istri',
                            'suami' => 'Suami',
                            'anak' => 'Anak',
                            'menantu' => 'Menantu',
                            'mertua' => 'Mertua',
                            'cucu' => 'Cucu',
                            'nenek' => 'Nenek',
                            'kakek' => 'Kakek',
                            'lainnya' => 'Lainnya',
                        ]) // Asumsi Anda punya model HubunganKeluarga
                        ->required(),
                ])
                ->defaultItems(0) // Mulai dengan 0 item
                ->columns(2) // Sesuaikan jumlah kolom
                ->collapsible() // Bisa dilipat
                ->cloneable(false) // <-- TIDAK BISA DIDUPLIKASI
                ->reorderable(true) // Opsional: bisa diubah urutannya
                ->columnSpan('1/2')
                ->addActionLabel('Tambah Anggota')
                ->itemLabel(fn (array $state): ?string => $state['nama'] ?? null),
        ];
    }

    public function form(Form $form): Form
    {
        return $form
            ->schema($this->getFormSchema())
            ->model($this->record)
            ->statePath('data');
    }

    protected function getHeaderActions(): array
    {
        return [
            Actions\Action::make('save_anggota')
                ->label('Simpan Anggota Keluarga')
                ->icon('heroicon-o-check')
                ->color('success')
                ->action('saveAnggota'),
            Actions\Action::make('back_to_list')
                ->label('Kembali ke Daftar KK')
                ->icon('heroicon-o-arrow-left')
                ->color('gray')
                ->url(KartuKeluargaResource::getUrl('index')),
        ];
    }

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

            Notification::make()
                ->title('Anggota keluarga berhasil diperbarui.')
                ->success()
                ->send();

        } catch (\Exception $e) {
            Notification::make()
                ->title('Gagal menyimpan anggota keluarga!')
                ->body($e->getMessage())
                ->danger()
                ->persistent()
                ->send();
        }
    }
}