<?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\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->kepalaKeluarga->nama ?? '-',
            '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(),

            Repeater::make('anggota')
                ->relationship('anggotaKeluarga') // Asumsi relasi hasMany atau belongsToMany
                ->label('Anggota')
                ->schema([
                    Select::make('penduduk_id')
                        ->label('Penduduk')
                        ->options(
                            Penduduk::where('id', '!=', $kepalaKeluargaId) // <-- Validasi di sini
                                ->where('is_ignore', '=', false)
                                ->pluck('nama', 'id')
                        )
                        ->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();
        }
    }
}