<?php

namespace Modules\Lpj\Exports;

use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Modules\Lpj\Models\Slik;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;

/**
 * Export class untuk data SLIK (Sistem Layanan Informasi Keuangan)
 * 
 * Class ini menangani export data SLIK ke format Excel dengan:
 * - Mapping data sesuai struktur SLIK
 * - Format kolom yang sesuai (text, number, date)
 * - Header yang informatif
 */
class SlikExport implements WithColumnFormatting, WithHeadings, FromCollection, WithMapping
{
    /**
     * Mengambil collection data SLIK untuk di-export
     * 
     * @return \Illuminate\Support\Collection
     */
    public function collection()
    {
        return Slik::orderBy('created_at', 'desc')->get();
    }

    /**
     * Mapping data SLIK untuk setiap baris dalam Excel
     * 
     * @param \Modules\Lpj\Models\Slik $row
     * @return array
     */
    public function map($row): array
    {
        return [
            $row->id,                                           // A - ID
            $row->sandi_bank,                                   // B - Sandi Bank
            $row->tahun,                                        // C - Tahun
            $row->bulan,                                        // D - Bulan
            $row->flag_detail,                                  // E - Flag Detail
            $row->kode_register_agunan,                         // F - Kode Register Agunan
            $row->no_rekening,                                  // G - No Rekening
            $row->cif,                                          // H - CIF
            $row->kolektibilitas,                               // I - Kolektibilitas
            $row->fasilitas,                                    // J - Fasilitas
            $row->jenis_segmen_fasilitas,                       // K - Jenis Segmen Fasilitas
            $row->status_agunan,                                // L - Status Agunan
            $row->jenis_agunan,                                 // M - Jenis Agunan
            $row->peringkat_agunan,                             // N - Peringkat Agunan
            $row->lembaga_pemeringkat,                          // O - Lembaga Pemeringkat
            $row->jenis_pengikatan,                             // P - Jenis Pengikatan
            $row->tanggal_pengikatan,                           // Q - Tanggal Pengikatan
            $row->nama_pemilik_agunan,                          // R - Nama Pemilik Agunan
            $row->bukti_kepemilikan,                            // S - Bukti Kepemilikan
            $row->alamat_agunan,                                // T - Alamat Agunan
            $row->lokasi_agunan,                                // U - Lokasi Agunan
            $row->nilai_agunan,                                 // V - Nilai Agunan
            $row->nilai_agunan_menurut_ljk,                     // W - Nilai Agunan Menurut LJK
            $row->tanggal_penilaian_ljk,                        // X - Tanggal Penilaian LJK
            $row->nilai_agunan_penilai_independen,              // Y - Nilai Agunan Penilai Independen
            $row->nama_penilai_independen,                      // Z - Nama Penilai Independen
            $row->tanggal_penilaian_penilai_independen,         // AA - Tanggal Penilaian Penilai Independen
            $row->jumlah_hari_tunggakan,                        // AB - Jumlah Hari Tunggakan
            $row->status_paripasu,                              // AC - Status Paripasu
            $row->prosentase_paripasu,                          // AD - Prosentase Paripasu
            $row->status_kredit_join,                           // AE - Status Kredit Join
            $row->diasuransikan,                                // AF - Diasuransikan
            $row->keterangan,                                   // AG - Keterangan
            $row->kantor_cabang,                                // AH - Kantor Cabang
            $row->operasi_data,                                 // AI - Operasi Data
            $row->kode_cabang,                                  // AJ - Kode Cabang
            $row->nama_debitur,                                 // AK - Nama Debitur
            $row->nama_cabang,                                  // AL - Nama Cabang
            $row->flag,                                         // AM - Flag
            $row->created_at,                                   // AN - Created At
        ];
    }

    /**
     * Header kolom untuk Excel
     * 
     * @return array
     */
    public function headings(): array
    {
        return [
            'ID',
            'Sandi Bank',
            'Tahun',
            'Bulan',
            'Flag Detail',
            'Kode Register Agunan',
            'No Rekening',
            'CIF',
            'Kolektibilitas',
            'Fasilitas',
            'Jenis Segmen Fasilitas',
            'Status Agunan',
            'Jenis Agunan',
            'Peringkat Agunan',
            'Lembaga Pemeringkat',
            'Jenis Pengikatan',
            'Tanggal Pengikatan',
            'Nama Pemilik Agunan',
            'Bukti Kepemilikan',
            'Alamat Agunan',
            'Lokasi Agunan',
            'Nilai Agunan',
            'Nilai Agunan Menurut LJK',
            'Tanggal Penilaian LJK',
            'Nilai Agunan Penilai Independen',
            'Nama Penilai Independen',
            'Tanggal Penilaian Penilai Independen',
            'Jumlah Hari Tunggakan',
            'Status Paripasu',
            'Prosentase Paripasu',
            'Status Kredit Join',
            'Diasuransikan',
            'Keterangan',
            'Kantor Cabang',
            'Operasi Data',
            'Kode Cabang',
            'Nama Debitur',
            'Nama Cabang',
            'Flag',
            'Created At',
        ];
    }

    /**
     * Format kolom untuk Excel
     * 
     * @return array
     */
    public function columnFormats(): array
    {
        return [
            'A' => NumberFormat::FORMAT_NUMBER,                 // ID
            'B' => NumberFormat::FORMAT_TEXT,                   // Sandi Bank
            'C' => NumberFormat::FORMAT_TEXT,                   // Tahun
            'D' => NumberFormat::FORMAT_TEXT,                   // Bulan
            'E' => NumberFormat::FORMAT_TEXT,                   // Flag Detail
            'F' => NumberFormat::FORMAT_TEXT,                   // Kode Register Agunan
            'G' => NumberFormat::FORMAT_TEXT,                   // No Rekening
            'H' => NumberFormat::FORMAT_TEXT,                   // CIF
            'I' => NumberFormat::FORMAT_TEXT,                   // Kolektibilitas
            'J' => NumberFormat::FORMAT_TEXT,                   // Fasilitas
            'K' => NumberFormat::FORMAT_TEXT,                   // Jenis Segmen Fasilitas
            'L' => NumberFormat::FORMAT_TEXT,                   // Status Agunan
            'M' => NumberFormat::FORMAT_TEXT,                   // Jenis Agunan
            'N' => NumberFormat::FORMAT_TEXT,                   // Peringkat Agunan
            'O' => NumberFormat::FORMAT_TEXT,                   // Lembaga Pemeringkat
            'P' => NumberFormat::FORMAT_TEXT,                   // Jenis Pengikatan
            'Q' => NumberFormat::FORMAT_DATE_DDMMYYYY,          // Tanggal Pengikatan
            'R' => NumberFormat::FORMAT_TEXT,                   // Nama Pemilik Agunan
            'S' => NumberFormat::FORMAT_TEXT,                   // Bukti Kepemilikan
            'T' => NumberFormat::FORMAT_TEXT,                   // Alamat Agunan
            'U' => NumberFormat::FORMAT_TEXT,                   // Lokasi Agunan
            'V' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Nilai Agunan
            'W' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Nilai Agunan Menurut LJK
            'X' => NumberFormat::FORMAT_DATE_DDMMYYYY,          // Tanggal Penilaian LJK
            'Y' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Nilai Agunan Penilai Independen
            'Z' => NumberFormat::FORMAT_TEXT,                   // Nama Penilai Independen
            'AA' => NumberFormat::FORMAT_DATE_DDMMYYYY,         // Tanggal Penilaian Penilai Independen
            'AB' => NumberFormat::FORMAT_NUMBER,                // Jumlah Hari Tunggakan
            'AC' => NumberFormat::FORMAT_TEXT,                  // Status Paripasu
            'AD' => NumberFormat::FORMAT_PERCENTAGE_00,         // Prosentase Paripasu
            'AE' => NumberFormat::FORMAT_TEXT,                  // Status Kredit Join
            'AF' => NumberFormat::FORMAT_TEXT,                  // Diasuransikan
            'AG' => NumberFormat::FORMAT_TEXT,                  // Keterangan
            'AH' => NumberFormat::FORMAT_TEXT,                  // Kantor Cabang
            'AI' => NumberFormat::FORMAT_TEXT,                  // Operasi Data
            'AJ' => NumberFormat::FORMAT_TEXT,                  // Kode Cabang
            'AK' => NumberFormat::FORMAT_TEXT,                  // Nama Debitur
            'AL' => NumberFormat::FORMAT_TEXT,                  // Nama Cabang
            'AM' => NumberFormat::FORMAT_TEXT,                  // Flag
            'AN' => NumberFormat::FORMAT_DATE_DATETIME,         // Created At
        ];
    }
}