<?php

namespace App\Controllers\Api;

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

class Pesanan extends ResourceController
{
    use ResponseTrait;

    // 1. API UNTUK CHECKOUT (BUAT PESANAN)
    public function checkout()
    {
        // Karena Flutter akan mengirim JSON array kompleks (berisi keranjang), kita gunakan getJSON()
        $json = $this->request->getJSON();

        if (!$json) return $this->failValidationErrors('Data pesanan tidak valid');

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

        // Mulai Transaksi Database (Jika salah satu tabel gagal, semua dibatalkan)
        $db = \Config\Database::connect();
        $db->transStart();

        // 1. Generate Nomor Pesanan (Contoh: PSN-20260409-RANDOM)
        $noPesanan = 'PSN-' . date('Ymd') . '-' . rand(1000, 9999);

        // 2. Simpan ke tabel pesanan
        $dataPesanan = [
            'no_pesanan'         => $noPesanan,
            'id_pengguna'        => $json->id_pengguna,
            'tanggal_pengiriman' => $json->tanggal_pengiriman,
            'waktu_pengiriman'   => $json->waktu_pengiriman,
            'alamat_lengkap'     => $json->alamat_lengkap,
            'patokan_jalan'      => $json->patokan_jalan ?? '',
            'status_pesanan'     => 'menunggu_konfirmasi'
        ];
        $pesananModel->insert($dataPesanan);
        $idPesanan = $pesananModel->getInsertID(); // Ambil ID yang baru saja dibuat

        // 3. Simpan isi keranjang ke detail_pesanan
        $totalSubtotal = 0;
        foreach ($json->items as $item) {
            $subtotal = $item->jumlah_porsi * $item->harga_satuan;
            $totalSubtotal += $subtotal;

            $detailModel->insert([
                'id_pesanan'   => $idPesanan,
                'id_paket'     => $item->id_paket,
                'jumlah_porsi' => $item->jumlah_porsi,
                'harga_satuan' => $item->harga_satuan,
                'subtotal'     => $subtotal
            ]);
        }

        // 4. Simpan ke tabel pembayaran
        $ongkosKirim = $json->ongkos_kirim ?? 0;
        $totalTagihan = $totalSubtotal + $ongkosKirim;

        $bayarModel->insert([
            'id_pesanan'        => $idPesanan,
            'ongkos_kirim'      => $ongkosKirim,
            'total_tagihan'     => $totalTagihan,
            'status_pembayaran' => 'belum_bayar'
        ]);

        $db->transComplete(); // Selesai transaksi

        if ($db->transStatus() === FALSE) {
            return $this->failServerError('Gagal membuat pesanan');
        }

        return $this->respondCreated([
            'status'  => 201,
            'error'   => false,
            'message' => 'Pesanan berhasil dibuat!',
            'data'    => ['no_pesanan' => $noPesanan, 'total_tagihan' => $totalTagihan]
        ]);
    }

    // 2. API UNTUK MENGAMBIL RIWAYAT PESANAN USER
    public function riwayat($id_pengguna = null)
    {
        if($id_pengguna == null) return $this->failValidationErrors('ID Pengguna diperlukan');

        $pesananModel = new PesananModel();
        
        // Gabungkan tabel pesanan dan pembayaran untuk ditampilkan di aplikasi
        $data = $pesananModel->select('pesanan.*, pembayaran.total_tagihan, pembayaran.status_pembayaran')
                             ->join('pembayaran', 'pembayaran.id_pesanan = pesanan.id_pesanan')
                             ->where('id_pengguna', $id_pengguna)
                             ->orderBy('waktu_dibuat', 'DESC')
                             ->findAll();

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

        return $this->respond(['status' => 200, 'error' => false, 'data' => $data], 200);
    }
    
    public function konfirmasi_pembayaran()
{
    $idPesanan = $this->request->getVar('id_pesanan');
    $fileBukti = $this->request->getFile('bukti_transfer');

    if ($fileBukti && $fileBukti->isValid() && !$fileBukti->hasMoved()) {
        
        // Ambil ekstensi asli dari file yang dikirim (misal: jpg atau png)
        $ekstensi = $fileBukti->getClientExtension(); 
        
        // Buat nama acak tapi kita pasang ekstensinya secara manual
        $namaFile = $fileBukti->getRandomName(); 
        
        // Kadang getRandomName dapet .bin, kita ganti ke ekstensi asli biar aman
        $namaFile = str_replace('.bin', '.' . $ekstensi, $namaFile);
        
        $fileBukti->move('uploads/bukti/', $namaFile);

        // 3. Update database sesuai nama kolom Anda: url_bukti_transfer
        $db = \Config\Database::connect();
        $update = $db->table('pembayaran')
           ->where('id_pesanan', $idPesanan)
           ->update([
               'url_bukti_transfer' => $namaFile, // Sesuaikan dengan kolom Anda
               'status_pembayaran'  => 'menunggu_verifikasi'
           ]);

        if ($update) {
            return $this->respond([
                'status'  => 200,
                'error'   => false,
                'message' => 'Bukti berhasil diunggah dan database terupdate!'
            ], 200);
        } else {
            return $this->failServerError('Gagal memperbarui data di database');
        }
    }

    return $this->fail('File tidak valid atau gagal diunggah');
}
}