<?php

namespace App\Exports;

use App\Models\Pindah;
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 PindahExport implements FromQuery, WithHeadings, WithMapping, WithStyles, ShouldAutoSize
{
    protected ?int $dusunId = null;
    protected ?string $tanggalPindahDari = null;
    protected ?string $tanggalPindahSampai = null;

    public function __construct(
        ?int $dusunId = null,
        ?string $tanggalPindahDari = null,
        ?string $tanggalPindahSampai = null
    ) {
        $this->dusunId = $dusunId;
        $this->tanggalPindahDari = $tanggalPindahDari;
        $this->tanggalPindahSampai = $tanggalPindahSampai;
    }

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

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

        if ($this->tanggalPindahDari) {
            $query->where('tanggal_pindah', '>=', $this->tanggalPindahDari);
        }

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

        return $query;
    }

    public function headings(): array
    {
        return [
            'No',
            'Nama Penduduk',
            'NIK',
            'Jenis Kelamin',
            'Asal Dusun', // Dusun asal dari penduduk yang pindah
            'Tanggal Pindah',
            'Alasan Pindah',
            'Tanggal Dibuat',
            'Tanggal Diperbarui',
        ];
    }

    public function map($pindah): array
    {
        $penduduk = $pindah->penduduk;
        $dusunNama = $penduduk->dusun->nama ?? 'N/A'; // Nama dusun dari penduduk yang pindah

        $counter = 0;
        $counter++;

        return [
            $counter,
            $penduduk->nama ?? 'N/A',
            ' ' . ($penduduk->nik ?? 'N/A'), // Tambahkan spasi agar NIK dibaca sebagai teks
            $penduduk->jenis_kelamin ?? 'N/A',
            $dusunNama,
            $pindah->tanggal_pindah ? Carbon::parse($pindah->tanggal_pindah)->format('d-m-Y') : 'N/A',
            $pindah->alasan,
            $pindah->created_at->format('d-m-Y H:i:s'),
            $pindah->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
                ],
            ],
        ]);
    }
}