<?php

namespace App\Controllers;

use App\Models\TransaksiModel;
use App\Models\PetaniModel;
use App\Models\PupukModel;
use App\Models\KeuanganModel;

class Transaksi extends BaseController
{
    protected $transaksiM;
    protected $db;

    public function __construct()
    {
        $this->transaksiM = new TransaksiModel();
        $this->db = \Config\Database::connect();
    }

    public function index()
    {
        $petaniM = new PetaniModel();
        $pupukM = new PupukModel();

        // Menggunakan Query Builder + Join agar nama relasi terbaca sempurna
        $builder = $this->db->table('transaksi_penebusan');
        $builder->select('transaksi_penebusan.*, petani.nama_petani, petani.nik, pupuk.nama_pupuk');
        $builder->join('petani', 'petani.id_petani = transaksi_penebusan.id_petani');
        $builder->join('pupuk', 'pupuk.id_pupuk = transaksi_penebusan.id_pupuk');
        $builder->orderBy('transaksi_penebusan.tanggal_transaksi', 'DESC');
        $transaksi = $builder->get()->getResultArray();

        // PERBAIKAN: Ambil data alokasi kuota tahun berjalan dari Controller
        $kuota_all = $this->db->table('alokasi_kuota')
                             ->where('tahun_tanam', date('Y'))
                             ->get()->getResultArray();

        $data = [
            'title'     => 'Transaksi Penebusan Pupuk',
            'transaksi' => $transaksi,
            'petani'    => $petaniM->findAll(),
            'pupuk'     => $pupukM->findAll(),
            'kuota_all' => $kuota_all // Dititipkan disini agar dibaca bersih oleh View
        ];
        return view('transaksi/index', $data);
    }

    public function proses_penebusan()
    {
        $id_petani   = $this->request->getPost('id_petani');
        $id_pupuk    = $this->request->getPost('id_pupuk');
        $jumlah_beli = $this->request->getPost('jumlah_beli');
        $tahun_ini   = date('Y');

        // 1. VALIDASI: Cek Sisa Kuota Petani
        $builderAlokasi = $this->db->table('alokasi_kuota');
        $kuota = $builderAlokasi->where([
            'id_petani'   => $id_petani, 
            'id_pupuk'    => $id_pupuk, 
            'tahun_tanam' => $tahun_ini
        ])->get()->getRowArray();

        if (!$kuota || ($kuota['jatah_kg'] - $kuota['terpakai_kg']) < $jumlah_beli) {
            return redirect()->to('/transaksi')->with('error', 'Transaksi Ditolak! Kuota petani tidak mencukupi atau belum diatur.');
        }

        // 2. VALIDASI: Cek Stok Gudang
        $pupukM = new PupukModel();
        $dataPupuk = $pupukM->find($id_pupuk);

        if ($dataPupuk['stok_global'] < $jumlah_beli) {
            return redirect()->to('/transaksi')->with('error', 'Transaksi Ditolak! Stok pupuk di gudang tidak mencukupi.');
        }

        // HITUNG TOTAL BAYAR
        $total_bayar = $jumlah_beli * $dataPupuk['harga_het'];
        $no_invoice  = 'INV-' . date('YmdHis');

        // ========================================================
        // MULAI DATABASE TRANSACTION
        // ========================================================
        $this->db->transStart();

        // A. Insert ke Tabel Transaksi
        $this->transaksiM->insert([
            'no_invoice'  => $no_invoice,
            'id_petani'   => $id_petani,
            'id_pupuk'    => $id_pupuk,
            'jumlah_beli' => $jumlah_beli,
            'total_bayar' => $total_bayar
        ]);
        
        $id_transaksi_baru = $this->transaksiM->insertID();

        // B. Kurangi Stok Pupuk
        $this->db->table('pupuk')
            ->where('id_pupuk', $id_pupuk)
            ->set('stok_global', 'stok_global - ' . (float)$jumlah_beli, false)
            ->update();

        // C. Update Kuota Terpakai
        $this->db->table('alokasi_kuota')
            ->where('id_alokasi', $kuota['id_alokasi'])
            ->set('terpakai_kg', 'terpakai_kg + ' . (float)$jumlah_beli, false)
            ->update();

        // D. Catat Uang Masuk ke Keuangan
        $keuanganM = new KeuanganModel();
        $saldoTerakhir = $keuanganM->orderBy('id_kas', 'DESC')->first()['saldo_akhir'] ?? 0;

        $keuanganM->insert([
            'tanggal'                => date('Y-m-d'),
            'keterangan'             => "Penebusan Pupuk ($no_invoice)",
            'jenis'                  => 'masuk',
            'kategori'               => 'penebusan',
            'nominal'                => $total_bayar,
            'saldo_akhir'            => $saldoTerakhir + $total_bayar,
            'id_referensi_transaksi' => $id_transaksi_baru
        ]);

        $this->db->transComplete();
        // ========================================================

        if ($this->db->transStatus() === false) {
            return redirect()->to('/transaksi')->with('error', 'Terjadi kesalahan sistem saat memproses data.');
        }

        return redirect()->to('/transaksi')->with('success', 'Transaksi berhasil! Stok telah dikurangi.');
    }

    public function rekap_penebusan()
    {
        $sqlHarian = "SELECT DATE(t.tanggal_transaksi) as tanggal, p.nama_pupuk, 
                             SUM(t.jumlah_beli) as total_kg, SUM(t.total_bayar) as total_dana 
                      FROM transaksi_penebusan t
                      JOIN pupuk p ON p.id_pupuk = t.id_pupuk
                      GROUP BY DATE(t.tanggal_transaksi), t.id_pupuk
                      ORDER BY DATE(t.tanggal_transaksi) DESC";
        $qHarian = $this->db->query($sqlHarian)->getResultArray();

        $sqlBulanan = "SELECT MONTH(t.tanggal_transaksi) as bulan, YEAR(t.tanggal_transaksi) as tahun, p.nama_pupuk, 
                              SUM(t.jumlah_beli) as total_kg, SUM(t.total_bayar) as total_dana 
                       FROM transaksi_penebusan t
                       JOIN pupuk p ON p.id_pupuk = t.id_pupuk
                       GROUP BY YEAR(t.tanggal_transaksi), MONTH(t.tanggal_transaksi), t.id_pupuk
                       ORDER BY YEAR(t.tanggal_transaksi) DESC, MONTH(t.tanggal_transaksi) DESC";
        $qBulanan = $this->db->query($sqlBulanan)->getResultArray();

        $data = [
            'title'   => 'Rekap Kuantitas Penebusan Pupuk Keluar',
            'harian'  => $qHarian,
            'bulanan' => $qBulanan
        ];

        return view('transaksi/rekap', $data);
    }

    public function cetak_nota($id)
    {
        $builder = $this->db->table('transaksi_penebusan');
        $builder->select('transaksi_penebusan.*, petani.nama_petani, petani.nik, pupuk.nama_pupuk, pupuk.harga_het');
        $builder->join('petani', 'petani.id_petani = transaksi_penebusan.id_petani');
        $builder->join('pupuk', 'pupuk.id_pupuk = transaksi_penebusan.id_pupuk');
        $builder->where('transaksi_penebusan.id_transaksi', $id);
        $dataTransaksi = $builder->get()->getRowArray();

        if (!$dataTransaksi) {
            return "Maaf, data nota transaksi tidak ditemukan atau sudah dihapus!";
        }

        $data = [
            'title' => 'Nota Penebusan - ' . $dataTransaksi['no_invoice'],
            't'     => $dataTransaksi
        ];

        return view('transaksi/nota', $data);
    }
    
    public function rekap_pupuk()
{
    // Proteksi login terpusat
    if (!session()->get('role')) {
        return redirect()->to('/auth')->with('error', 'Silakan login terlebih dahulu.');
    }

    $db = \Config\Database::connect();

    // 1. Tangkap parameter filter dari URL (Default ke bulan & tahun berjalan jika kosong)
    $filter_type = $this->request->getGet('filter_type') ?? 'bulanan';
    $tanggal     = $this->request->getGet('tanggal') ?? date('Y-m-d');
    $bulan       = $this->request->getGet('bulan') ?? date('m');
    $tahun       = $this->request->getGet('tahun') ?? date('Y');

    // 2. Ambil semua master data jenis pupuk
    $masterPupuk = $db->table('pupuk')->get()->getResultArray();
    $rekapData   = [];
    $terlaris    = ['nama_pupuk' => '-', 'jumlah' => 0];

    // 3. Looping untuk menghitung mutasi masuk & keluar tiap pupuk berdasarkan filter waktu
    foreach ($masterPupuk as $p) {
        $id_pupuk = $p['id_pupuk'];

        // Kueri hitung Pasokan Pupuk Masuk
        $qMasuk = $db->table('pupuk_masuk')->where('id_pupuk', $id_pupuk);
        
        // KUNCI PERBAIKAN: Mengubah dari 'transaksi' menjadi 'transaksi_penebusan' sesuai database Anda
        $qKeluar = $db->table('transaksi_penebusan')->where('id_pupuk', $id_pupuk);

        // Penerapan Kondisi Filter Waktu (Harian / Bulanan / Tahunan)
        if ($filter_type === 'harian') {
            $qMasuk->where('tanggal_masuk', $tanggal);
            $qKeluar->where('DATE(tanggal_transaksi)', $tanggal);
        } elseif ($filter_type === 'tahunan') {
            $qMasuk->where('YEAR(tanggal_masuk)', $tahun);
            $qKeluar->where('YEAR(tanggal_transaksi)', $tahun);
        } else { // Default Bulanan
            $qMasuk->where('MONTH(tanggal_masuk)', $bulan)->where('YEAR(tanggal_masuk)', $tahun);
            $qKeluar->where('MONTH(tanggal_transaksi)', $bulan)->where('YEAR(tanggal_transaksi)', $tahun);
        }

        // Eksekusi penjumlahan total kuantitas (Kg)
        $totalMasuk  = (float)($qMasuk->selectSum('jumlah_masuk')->get()->getRow()->jumlah_masuk ?? 0);
        
        // Note: Pastikan nama kolom jumlah pada transaksi_penebusan adalah 'jumlah_beli' 
        // Jika nama kolomnya berbeda (misal: 'jumlah_tebus'), silakan sesuaikan string di bawah ini
        $totalKeluar = (float)($qKeluar->selectSum('jumlah_beli')->get()->getRow()->jumlah_beli ?? 0);

        // Catat siapa pupuk yang paling tinggi angka pembeliannya (Terlaris)
        if ($totalKeluar > $terlaris['jumlah']) {
            $terlaris = [
                'nama_pupuk' => $p['nama_pupuk'],
                'jumlah'     => $totalKeluar
            ];
        }

        $rekapData[] = [
            'kode_pupuk'   => $p['kode_pupuk'],
            'nama_pupuk'   => $p['nama_pupuk'],
            'stok_aktual'  => $p['stok_global'],
            'total_masuk'  => $totalMasuk,
            'total_keluar' => $totalKeluar
        ];
    }

    // 4. Bungkus data laporan untuk dikirim ke View
    $data = [
        'title'        => 'Laporan Mutasi & Rekap Pupuk Terlaris',
        'rekap'        => $rekapData,
        'terlaris'     => $terlaris,
        'filter_type'  => $filter_type,
        'tanggal'      => $tanggal,
        'bulan'        => $bulan,
        'tahun'        => $tahun
    ];

    return view('transaksi/rekap_pupuk', $data);
}
}