<?php

namespace App\Filament\Resources\PindahResource\Pages;

use App\Filament\Resources\PindahResource;
use App\Models\Penduduk;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Filament\Notifications\Notification; // Import Notification

class CreatePindah extends CreateRecord
{
    protected static string $resource = PindahResource::class;
    
    protected function handleRecordCreation(array $data): \Illuminate\Database\Eloquent\Model
    {
        return DB::transaction(function () use ($data) {
            // 1. Buat record Pindah terlebih dahulu
            // Pastikan model Pindah memiliki field yang sesuai dengan $data
            $pindah = static::getModel()::create($data);
            Log::info('Record pindah berhasil dibuat untuk Penduduk ID: ' . $data['penduduk_id']);

            // 2. Update status_penduduk pada model Penduduk yang sesuai
            // Cari penduduk berdasarkan ID dari data form
            $penduduk = Penduduk::find($data['penduduk_id']);

            if ($penduduk) {
                $penduduk->update([
                    'status_penduduk' => 'pindah'
                ]);
                Log::info('Status Penduduk ID: ' . $penduduk->id . ' diupdate menjadi "pindah".');

                // Notifikasi sukses setelah update penduduk
                Notification::make()
                    ->title('Data pindah dan status penduduk berhasil disimpan!')
                    ->success()
                    ->send();

            } else {
                Log::warning('Penduduk dengan ID: ' . $data['penduduk_id'] . ' tidak ditemukan saat mencoba mengupdate status.');

                // Notifikasi error ke user
                Notification::make()
                    ->title('Gagal membuat data pindah.')
                    ->body('Penduduk dengan ID: ' . $data['penduduk_id'] . ' tidak ditemukan. Silakan periksa data penduduk.')
                    ->danger()
                    ->persistent() // Agar notifikasi tetap terlihat sampai user menutupnya
                    ->send();

                // Throw exception untuk membatalkan transaksi dan mencegah pembuatan record pindah tanpa update penduduk
                throw new \Exception('Penduduk tidak ditemukan.');
            }

            return $pindah;
        });
    }

    // Override metode ini untuk menangkap exception dari handleRecordCreation
    protected function mutateFormDataBeforeCreate(array $data): array
    {
        // Tidak ada perubahan data di sini, hanya untuk menunjukkan bagaimana exception ditangkap
        return $data;
    }

    protected function getCreatedNotification(): ?Notification
    {
        // Kita akan mengirim notifikasi dari dalam handleRecordCreation,
        // jadi kita bisa mengembalikan null di sini atau mengoverride secara total
        // agar notifikasi bawaan Filament tidak muncul dua kali.
        return null;
    }

    protected function onException(\Throwable $exception): void
    {
        // Log error secara umum jika ada exception yang tidak tertangkap di handleRecordCreation
        Log::error('Error creating Pindah record: ' . $exception->getMessage());
        
        // Filament akan menampilkan notifikasi default untuk exception yang di-throw.
        // Jika Anda ingin pesan yang lebih spesifik, bisa di-custom di sini.
        Notification::make()
            ->title('Terjadi kesalahan saat menyimpan data.')
            ->body($exception->getMessage())
            ->danger()
            ->persistent()
            ->send();
    }


    protected function getRedirectUrl(): string
    {
        return $this->getResource()::getUrl('index');
    }
}