<?php

namespace App\Exports;

use App\Models\Penduduk;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithStyles;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Color;
use Illuminate\Support\Collection; // Pastikan ini di-import

class PendudukExport implements FromCollection, WithHeadings, ShouldAutoSize, WithStyles
{
    /**
    * @return \Illuminate\Support\Collection
    */
    public function collection()
    {
        // 1. Memuat Relasi dengan Eager Loading
        $dataToExport = Penduduk::with(['dusun', 'kartuKeluargaSebagaiKepala', 'anggotaKeluarga.kartuKeluarga'])->get();
        $counter = 0;

        return $dataToExport->map(function($penduduk) use (&$counter) {
            $counter++;

            // 2. Logika Penentuan Nomor KK
            $nomorKk = '-';

            // Cek apakah penduduk adalah kepala keluarga
            if ($penduduk->kartuKeluargaSebagaiKepala->isNotEmpty()) {
                // Asumsi satu penduduk hanya bisa menjadi kepala satu KK
                $nomorKk = $penduduk->kartuKeluargaSebagaiKepala->first()->nomor_kk;
            }
            // Jika bukan kepala keluarga, cek apakah dia anggota keluarga
            else if ($penduduk->anggotaKeluarga->isNotEmpty()) {
                // Asumsi satu penduduk hanya terdaftar sebagai anggota satu KK (primary)
                // Kita ambil yang pertama saja
                if ($penduduk->anggotaKeluarga->first()->kartuKeluarga) {
                    $nomorKk = $penduduk->anggotaKeluarga->first()->kartuKeluarga->nomor_kk;
                }
            }


            return [
                'No' => $counter,
                'NIK' => " " . (string) $penduduk->nik, // Tambahkan spasi agar dianggap teks oleh Excel
                'Nama' => $penduduk->nama,
                'NO KK' => " " . (string) $nomorKk, // Tambahkan spasi agar dianggap teks oleh Excel
                'Tempat Lahir' => $penduduk->tempat_lahir,
                'Tanggal Lahir' => $penduduk->tanggal_lahir,
                'Jenis Kelamin' => $penduduk->jenis_kelamin,
                'Alamat' => $penduduk->alamat,
                'Dusun' => $penduduk->dusun->nama ?? '-', // Handle jika dusun null
                'RT' => $penduduk->rt,
                'RW' => $penduduk->rw,
                'Agama' => $penduduk->agama,
                'Perkawinan' => $penduduk->perkawinan,
                'Pekerjaan' => $penduduk->pekerjaan,
                'Status Penduduk' => $penduduk->status_penduduk,
                'Dibuat Pada' => $penduduk->created_at,
            ];
        });
    }

    /**
    * @return array
    */
    public function headings(): array
    {
        return [
            'No',
            'NIK',
            'Nama',
            'NO KK', // Tambahkan header untuk Nomor KK
            'Tempat Lahir',
            'Tanggal Lahir',
            'Jenis Kelamin',
            'Alamat',
            'Dusun',
            'RT',
            'RW',
            'Agama',
            'Perkawinan',
            'Pekerjaan',
            'Status Penduduk',
            'Dibuat Pada',
        ];
    }

    /**
     * Metode ini digunakan untuk menerapkan gaya pada worksheet.
     *
     * @param Worksheet $sheet
     */
    public function styles(Worksheet $sheet)
    {
        // Memberi warna latar belakang pada baris header (baris 1)
        $sheet->getStyle('A1:' . $sheet->getHighestColumn() . '1')->applyFromArray([
            'font' => [
                'bold' => true,
                'color' => ['argb' => Color::COLOR_WHITE], // Warna teks putih
            ],
            'fill' => [
                'fillType' => Fill::FILL_SOLID,
                'startColor' => [
                    'argb' => Color::COLOR_DARKGREEN, // Warna hijau gelap untuk header
                ],
            ],
        ]);
    }
}