<?php

namespace App\Exports;

use App\Models\Pendatang;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithStyles;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Illuminate\Database\Eloquent\Builder;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Color;
use Carbon\Carbon; // Untuk memformat tanggal

class PendatangExport implements FromQuery, WithHeadings, WithMapping, WithStyles, ShouldAutoSize
{
    protected ?int $dusunIdTujuan = null;
    protected ?string $tanggalDatangDari = null;
    protected ?string $tanggalDatangSampai = null;

    public function __construct(
        ?int $dusunIdTujuan = null,
        ?string $tanggalDatangDari = null,
        ?string $tanggalDatangSampai = null
    ) {
        $this->dusunIdTujuan = $dusunIdTujuan;
        $this->tanggalDatangDari = $tanggalDatangDari;
        $this->tanggalDatangSampai = $tanggalDatangSampai;
    }

    public function query(): Builder
    {
        $query = Pendatang::query()->with(['penduduk.dusun']);

        if ($this->dusunIdTujuan) {
            $query->whereHas('penduduk', function (Builder $pendudukQuery) {
                $pendudukQuery->where('dusun_id', $this->dusunIdTujuan);
            });
        }

        if ($this->tanggalDatangDari) {
            $query->where('tanggal_datang', '>=', $this->tanggalDatangDari);
        }

        if ($this->tanggalDatangSampai) {
            $query->where('tanggal_datang', '<=', $this->tanggalDatangSampai);
        }

        return $query;
    }

    public function headings(): array
    {
        return [
            'No',
            'NIK',
            'Nama Pendatang',
            'Jenis Kelamin',
            'Tempat Lahir',
            'Tanggal Lahir',
            'Alamat Tujuan',
            'Dusun Tujuan',
            'Agama',
            'Tujuan Datang',
            'Alasan Datang',
            'Tanggal Datang',
            'Tanggal Dibuat',
            'Tanggal Diperbarui',
        ];
    }

    public function map($pendatang): array
    {
        $penduduk = $pendatang->penduduk;
        $dusunTujuanNama = $penduduk->dusun->nama ?? 'N/A';
        $counter = 0;
        $counter++;

        return [
            $counter,
            ' ' . ($penduduk->nik ?? 'N/A'), // Tambahkan spasi agar NIK dibaca sebagai teks
            $penduduk->nama ?? 'N/A',
            $penduduk->jenis_kelamin ?? 'N/A',
            $penduduk->tempat_lahir ?? 'N/A',
            $penduduk->tanggal_lahir ? Carbon::parse($penduduk->tanggal_lahir)->format('d-m-Y') : 'N/A',
            $penduduk->alamat ?? 'N/A', // Asumsi alamat di model Penduduk
            $dusunTujuanNama,
            $penduduk->agama ?? 'N/A',
            $pendatang->alamat ?? 'N/A',
            $pendatang->alasan_datang ?? 'N/A',
            $pendatang->tanggal_datang ? Carbon::parse($pendatang->tanggal_datang)->format('d-m-Y') : 'N/A',
            $pendatang->created_at->format('d-m-Y H:i:s'),
            $pendatang->updated_at->format('d-m-Y H:i:s'),
        ];
    }

    /**
     * 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
                ],
            ],
        ]);
    }
}