<?php

namespace App\Models;

use CodeIgniter\Model;

class PermintaanCustomModel extends Model
{
    protected $table            = 'tabel_permintaan_custom';
    protected $primaryKey       = 'kode_permintaan_custom';
    protected $useAutoIncrement = true;
    protected $returnType       = 'object';
    protected $allowedFields    = [
        'no_order_custom',
        'tanggal_order',
        'tanggal_pengambilan',
        'id_customer',
        'total_order',
        'dp_pembayaran',
        'sisa_pembayaran',
        'nominal_pelunasan',
        'tanggal_pelunasan',
        'status_pengiriman',
        'status_pelunasan',
        'alamat_pengiriman',
        'status',
        'bukti_pembayaran',
        'bukti_pembayaran_dp',
        'metode_pembayaran',
        'catatan_pelanggan',
        'catatan_toko',
        'estimasi_selesai',
        'estimasi_pengerjaan',
        'status_admin_konfirmasi',
        'status_kasir_konfirmasi',
        'tgl_admin_konfirmasi',
        'tgl_kasir_konfirmasi',
        'status_pesanan',
        // New fields for revisi
        'created_by_role',
        'tanggal_pengambilan_approved',
        'tanggal_pengambilan_note',
        'alamat_locked',
        'alamat_locked_at',
        'alamat_change_request',
        'alamat_change_request_at',
        'alamat_change_approved',
        'alamat_change_approved_at',
        'alamat_change_approved_by',
        'alamat_change_note',
        'confirmed_at',
        'meter_input_at',
        'production_started_at',
        'production_completed_at',
        'payment_completed_at',
        'meter_completed_at',
        // 'ongkos_pengerjaan',
        // 'ongkos_jahit',
    ];

    protected $useTimestamps = true;
    protected $createdField  = 'created_at';
    protected $updatedField  = 'updated_at';

    public function generateInvoiceNumber(string $prefix = 'INV'): string
    {
        $datePart = date('Ymd');

        $fullPrefix = "{$prefix}/{$datePart}/";

        $latestInvoice = $this->db->table($this->table)
            ->like('no_order_custom', $fullPrefix, 'after')
            ->orderBy('no_order_custom', 'DESC')
            ->get(1)
            ->getRow();

        $lastNumber = 0;

        if ($latestInvoice) {
            $lastInvoiceNumber = $latestInvoice->no_order_custom;
            $lastNumber = (int) substr($lastInvoiceNumber, -6);
        }

        $newNumber = $lastNumber + 1;
        $paddedNumber = str_pad($newNumber, 6, '0', STR_PAD_LEFT);

        $invoiceNumber = "{$prefix}/{$datePart}/{$paddedNumber}";

        return $invoiceNumber;
    }

    /**
     * Hitung status pembayaran berdasarkan sisa pembayaran
     * Jika sisa = 0, maka Lunas, jika > 0 maka DP
     */
    public function calculatePaymentStatus($kode_permintaan): string
    {
        $order = $this->find($kode_permintaan);
        if ($order->sisa_pembayaran == 0) {
            return 'Lunas';
        } else {
            return 'DP';
        }
    }

    /**
     * Dapatkan status konfirmasi admin
     */
    public function getAdminConfirmationStatus($kode_permintaan): array
    {
        $order = $this->find($kode_permintaan);
        return [
            'status' => $order->status_admin_konfirmasi,
            'tgl_konfirmasi' => $order->tgl_admin_konfirmasi,
            'status_text' => $order->status_admin_konfirmasi == 1 ? 'Disetujui' : ($order->status_admin_konfirmasi == 2 ? 'Ditolak' : 'Menunggu')
        ];
    }

    /**
     * Dapatkan status konfirmasi kasir
     */
    public function getKasirConfirmationStatus($kode_permintaan): array
    {
        $order = $this->find($kode_permintaan);
        return [
            'status' => $order->status_kasir_konfirmasi,
            'tgl_konfirmasi' => $order->tgl_kasir_konfirmasi,
            'status_text' => $order->status_kasir_konfirmasi == 1 ? 'Disetujui' : 'Menunggu'
        ];
    }

    /**
     * Kunci alamat setelah pembayaran (DP atau Lunas)
     */
    public function lockAlamat($kode_permintaan): bool
    {
        return $this->update($kode_permintaan, [
            'alamat_locked' => 1,
            'alamat_locked_at' => date('Y-m-d H:i:s')
        ]);
    }

    /**
     * Cek apakah alamat sudah terkunci
     */
    public function isAlamatLocked($kode_permintaan): bool
    {
        $order = $this->find($kode_permintaan);
        return $order && $order->alamat_locked == 1;
    }

    /**
     * Request perubahan alamat oleh customer
     */
    public function requestAlamatChange($kode_permintaan, string $alamat_baru): bool
    {
        return $this->update($kode_permintaan, [
            'alamat_change_request' => $alamat_baru,
            'alamat_change_request_at' => date('Y-m-d H:i:s'),
            'alamat_change_approved' => null, // Reset approval status
            'alamat_change_approved_at' => null,
            'alamat_change_approved_by' => null,
            'alamat_change_note' => null
        ]);
    }

    /**
     * Approve atau reject perubahan alamat oleh admin/kasir
     */
    public function approveAlamatChange($kode_permintaan, bool $approved, int $approved_by, ?string $note = null): bool
    {
        $data = [
            'alamat_change_approved' => $approved ? 1 : 0,
            'alamat_change_approved_at' => date('Y-m-d H:i:s'),
            'alamat_change_approved_by' => $approved_by,
            'alamat_change_note' => $note
        ];

        // Jika approved, update alamat dan reset request
        if ($approved) {
            $order = $this->find($kode_permintaan);
            if ($order && $order->alamat_change_request) {
                $data['alamat_pengiriman'] = $order->alamat_change_request;
            }
        }

        return $this->update($kode_permintaan, $data);
    }

    /**
     * Cek apakah ada pending request perubahan alamat
     */
    public function hasPendingAlamatChangeRequest($kode_permintaan): bool
    {
        $order = $this->find($kode_permintaan);
        return $order
            && $order->alamat_change_request !== null
            && $order->alamat_change_approved === null;
    }
}
