<?php

namespace App\Imports;

use App\Models\DataPenjualan;
use Carbon\Carbon;
use Illuminate\Support\Facades\Auth;
use Exception;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class DataPenjualanImport implements ToModel, WithHeadingRow
{
    private bool $headerChecked = false;
    private array $duplicatedMonths = [];
    private array $existingDates = [];

    public function __construct()
    {
        // Ambil semua tanggal milik user yang sudah ada di database untuk pencocokan cepat
        $this->existingDates = DataPenjualan::where('user_id', Auth::id())
            ->pluck('tanggal')
            ->toArray();
    }

    public function model(array $row)
    {
        // Normalisasi header Excel
        $row = array_combine(
            array_map(fn($key) => trim(strtolower($key ?? '')), array_keys($row)),
            array_values($row)
        );

        if (!$this->headerChecked) {
            $requiredHeaders = ['tanggal_penjualan', 'jumlah'];
            foreach ($requiredHeaders as $header) {
                if (!in_array($header, array_keys($row))) {
                    throw new Exception("Header tidak sesuai. Gunakan kolom: tanggal_penjualan & jumlah.");
                }
            }
            $this->headerChecked = true;
        }

        if (empty($row['tanggal_penjualan'])) return null;

        $tanggalStr = $this->transformDate($row['tanggal_penjualan']);
        if (!$tanggalStr) return null;

        $currentDate = Carbon::parse($tanggalStr);
        $bulanTahunReadable = $currentDate->translatedFormat('F Y');

        // Cek jika tanggal pada baris excel ini sudah terdaftar di database sistem
        if (in_array($tanggalStr, $this->existingDates)) {
            if (!in_array($bulanTahunReadable, $this->duplicatedMonths)) {
                $this->duplicatedMonths[] = $bulanTahunReadable;
            }
            return null; // Skip baris ini, lanjut periksa baris berikutnya
        }

        return new DataPenjualan([
            'user_id' => Auth::id(),
            'tanggal' => $tanggalStr,
            'jumlah'  => $row['jumlah'],
        ]);
    }

    private function transformDate($value)
    {
        try {
            if (is_numeric($value)) {
                return Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value))->format('Y-m-d');
            }
            return Carbon::parse($value)->format('Y-m-d');
        } catch (\Throwable $e) {
            return null;
        }
    }

    /**
     * Destructor / Fungsi Akhir untuk melempar daftar bulan yang bentrok ke Controller
     */
    public function __destruct()
    {
        if (!empty($this->duplicatedMonths)) {
            $listBulan = implode(', ', $this->duplicatedMonths);
            throw new Exception("Data di Excel ini sudah ada pada sistem untuk periode: {$listBulan}.");
        }
    }
}