<?php

namespace App\Controllers\Api;

use CodeIgniter\RESTful\ResourceController;
use CodeIgniter\API\ResponseTrait;
use App\Models\UserModel;
use App\Models\PesananModel;
use App\Models\PembayaranModel;

class Admin extends ResourceController
{
    use ResponseTrait;

    // ==========================================
    // 1. DAFTAR PELANGGAN
    // ==========================================
    public function daftar_pelanggan()
    {
        $userModel = new UserModel();
        $pelanggan = $userModel->select('id_pengguna, nama, no_wa, email')
                               ->where('peran', 'pelanggan')
                               ->orderBy('nama', 'ASC')
                               ->findAll();

        if (!$pelanggan) return $this->failNotFound('Belum ada data pelanggan.');

        return $this->respond([
            'status'  => 200,
            'error'   => false,
            'message' => 'Data pelanggan berhasil diambil',
            'data'    => $pelanggan
        ], 200);
    }

    // ==========================================
    // 2. DAFTAR SEMUA PESANAN (FIX: Tambah no_wa)
    // ==========================================
    public function daftar_pesanan()
    {
        $pesananModel = new PesananModel();
        
        // PENTING: Saya menambahkan 'pengguna.no_wa' di sini agar WhatsApp di Flutter bisa jalan
        $data = $pesananModel->select('pesanan.*, pengguna.nama, pengguna.no_wa, pembayaran.total_tagihan, pembayaran.status_pembayaran, pembayaran.url_bukti_transfer')
                             ->join('pengguna', 'pengguna.id_pengguna = pesanan.id_pengguna')
                             ->join('pembayaran', 'pembayaran.id_pesanan = pesanan.id_pesanan')
                             ->orderBy('pesanan.waktu_dibuat', 'DESC')
                             ->findAll();

        return $this->respond([
            'status' => 200, 
            'error'  => false, 
            'message'=> 'Daftar pesanan berhasil diambil',
            'data'   => $data
        ], 200);
    }

    // ==========================================
    // 3. KONFIRMASI PEMBAYARAN (TRANSACTIONAL)
    // ==========================================
    public function konfirmasi_pesanan($id_pesanan = null)
    {
        if (!$id_pesanan) return $this->fail('ID Pesanan diperlukan');

        $pesananModel = new PesananModel();
        $bayarModel   = new PembayaranModel();

        $db = \Config\Database::connect();
        $db->transStart(); // Mulai transaksi untuk keamanan data

        // Update status pesanan jadi diproses
        $pesananModel->update($id_pesanan, ['status_pesanan' => 'diproses']);
        
        // Update status pembayaran jadi lunas
        $bayarModel->where('id_pesanan', $id_pesanan)
                   ->set(['status_pembayaran' => 'lunas'])
                   ->update();

        $db->transComplete();

        if ($db->transStatus() === FALSE) {
            return $this->failServerError('Gagal melakukan konfirmasi pada database');
        }

        return $this->respond([
            'status'  => 200, 
            'error'   => false,
            'message' => 'Pesanan Berhasil Dikonfirmasi!'
        ], 200);
    }

    // ==========================================
    // 4. LAPORAN RINGKASAN (DASHBOARD)
    // ==========================================
    public function laporan_ringkasan()
    {
        $pesananModel = new PesananModel();
        $bayarModel   = new PembayaranModel();

        // A. Hitung Statistik
        $totalPesananMasuk = $pesananModel->countAllResults();
        $totalPesananSelesai = $pesananModel->where('status_pesanan', 'selesai')->countAllResults();
        
        $queryPendapatan = $bayarModel->selectSum('total_tagihan')
                                     ->where('status_pembayaran', 'lunas')
                                     ->first();
        
        $totalPendapatan = $queryPendapatan['total_tagihan'] ?? 0;

        // B. Ambil 5 Pesanan Terbaru (FIX: Tambah no_wa juga di sini)
        $pesananTerbaru = $pesananModel->select('pesanan.no_pesanan, pengguna.nama, pengguna.no_wa, pesanan.status_pesanan, pembayaran.total_tagihan')
                                       ->join('pengguna', 'pengguna.id_pengguna = pesanan.id_pengguna')
                                       ->join('pembayaran', 'pembayaran.id_pesanan = pesanan.id_pesanan')
                                       ->orderBy('pesanan.waktu_dibuat', 'DESC')
                                       ->limit(5)
                                       ->findAll();

        return $this->respond([
            'status'  => 200,
            'error'   => false,
            'message' => 'Data laporan berhasil diambil',
            'data'    => [
                'total_pesanan_masuk'   => (int) $totalPesananMasuk,
                'total_pesanan_selesai' => (int) $totalPesananSelesai,
                'total_pendapatan'      => (int) $totalPendapatan,
                'pesanan_terbaru'       => $pesananTerbaru
            ]
        ], 200);
    }
    
    public function laporan_filter()
{
    // Ambil input tanggal
    $tglMulai = $this->request->getVar('tgl_mulai'); 
    $tglSelesai = $this->request->getVar('tgl_selesai');

    $db = \Config\Database::connect();
    
    // Gunakan builder untuk mempermudah debugging
    $builder = $db->table('pesanan');
    $builder->select('pesanan.no_pesanan, pesanan.waktu_dibuat, pengguna.nama, pembayaran.total_tagihan, pembayaran.status_pembayaran');
    $builder->join('pengguna', 'pengguna.id_pengguna = pesanan.id_pengguna', 'left'); // Gunakan LEFT agar data pengguna wajib ada
    $builder->join('pembayaran', 'pembayaran.id_pesanan = pesanan.id_pesanan', 'left'); // Gunakan LEFT jika pembayaran mungkin belum tercatat
    
    // Filter menggunakan DATE() agar jam tidak berpengaruh
    $builder->where("DATE(pesanan.waktu_dibuat) >=", $tglMulai);
    $builder->where("DATE(pesanan.waktu_dibuat) <=", $tglSelesai);
    
    $builder->orderBy('pesanan.waktu_dibuat', 'DESC');
    $data = $builder->get()->getResult();

    // DEBUG: Jika data kosong, kita kirimkan query aslinya untuk dicek di database
    if (empty($data)) {
        return $this->respond([
            'status' => 404,
            'error' => true,
            'message' => 'Data tidak ditemukan',
            'debug_query' => (string)$db->getLastQuery(), // Ini akan memunculkan SQL aslinya
            'input' => ['mulai' => $tglMulai, 'selesai' => $tglSelesai]
        ], 200);
    }

    return $this->respond(['status' => 200, 'error' => false, 'data' => $data], 200);
}
}