<?php

namespace App\Controllers;

use CodeIgniter\Controller;

class LaporanProduksi extends BaseController
{
    // ── GET /laporan/produksi ──────────────────────────────────────
    public function index()
    {
        return view('laporanproduksi/index', [
            'title' => 'Laporan Produksi',
        ]);
    }

    // ── GET /laporan/produksi/data (AJAX) ─────────────────────────
    public function data()
    {
        if (! $this->request->isAJAX()) {
            return redirect()->to('/laporan/produksi');
        }

        try {
            $periode  = $this->request->getGet('periode')   ?? 'bulanan';
            $dari     = $this->request->getGet('dari')      ?? date('Y-m-01');
            $sampai   = $this->request->getGet('sampai')    ?? date('Y-m-d');
            $idProduk = $this->request->getGet('id_produk') ?? '';

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

            // Nama kolom sesuai db_sim1:
            //   tb_produksi    → id_produksi, tanggal_produksi, status_produksi,
            //                    jumlah_produksi, id_produk, total_biaya_bahan,
            //                    total_biaya, hpp_per_unit
            //   tb_detail_produksi → id_produksi, id_bahan, jumlah_total,
            //                        harga_satuan_bahan, subtotal_bahan
            //   tb_bahan       → id_bahan, nama_bahan, satuan_bahan, harga_bahan
            //   tb_produk      → id_produk, kode_produk, nama_produk

            $baseWhere  = "p.status_produksi = 'selesai'
                           AND p.deleted_at IS NULL
                           AND p.tanggal_produksi BETWEEN '$dari' AND '$sampai'";
            $produkCond = $idProduk ? " AND p.id_produk = " . intval($idProduk) : '';

            // ═══════════════════════════════════════════════════════
            // 1. REKAP PERIODE
            // ═══════════════════════════════════════════════════════
            switch ($periode) {
                case 'harian':
                    $grpExpr = "DATE(p.tanggal_produksi)";
                    $lblExpr = "DATE_FORMAT(p.tanggal_produksi, '%d %b %Y')";
                    break;
                case 'mingguan':
                    $grpExpr = "YEARWEEK(p.tanggal_produksi, 1)";
                    $lblExpr = "CONCAT('Minggu ', WEEK(p.tanggal_produksi,1), ' ', YEAR(p.tanggal_produksi))";
                    break;
                default: // bulanan
                    $grpExpr = "DATE_FORMAT(p.tanggal_produksi, '%Y-%m')";
                    $lblExpr = "DATE_FORMAT(p.tanggal_produksi, '%b %Y')";
                    break;
            }

            $rekapPeriode = $db->query("
                SELECT
                    $lblExpr                        AS label,
                    COUNT(p.id_produksi)            AS total_batch,
                    SUM(p.jumlah_produksi)          AS total_kemasan,
                    SUM(p.total_biaya)              AS hpp_total,
                    CASE WHEN SUM(p.jumlah_produksi) > 0
                        THEN ROUND(SUM(p.total_biaya) / SUM(p.jumlah_produksi), 2)
                        ELSE 0 END                  AS hpp_per_kemasan
                FROM tb_produksi p
                WHERE $baseWhere $produkCond
                GROUP BY $grpExpr
                ORDER BY MIN(p.tanggal_produksi) ASC
            ")->getResultArray();

            // ═══════════════════════════════════════════════════════
            // 2. REKAP PER PRODUK
            // ═══════════════════════════════════════════════════════
            $rekapProduk = $db->query("
                SELECT
                    pr.id_produk,
                    pr.kode_produk,
                    pr.nama_produk,
                    COUNT(p.id_produksi)            AS total_batch,
                    SUM(p.jumlah_produksi)          AS total_kemasan,
                    SUM(p.total_biaya)              AS hpp_total,
                    CASE WHEN SUM(p.jumlah_produksi) > 0
                        THEN ROUND(SUM(p.total_biaya) / SUM(p.jumlah_produksi), 2)
                        ELSE 0 END                  AS hpp_per_kemasan
                FROM tb_produksi p
                JOIN tb_produk pr ON pr.id_produk = p.id_produk
                WHERE $baseWhere $produkCond
                GROUP BY pr.id_produk
                ORDER BY total_kemasan DESC
            ")->getResultArray();

            // ═══════════════════════════════════════════════════════
            // 3. PEMAKAIAN BAHAN
            // ═══════════════════════════════════════════════════════
            $pemakaianBahan = $db->query("
                SELECT
                    b.id_bahan,
                    b.nama_bahan,
                    b.satuan_bahan              AS satuan,
                    SUM(dp.jumlah_total)        AS total_terpakai,
                    b.harga_bahan               AS harga_per_satuan,
                    SUM(dp.subtotal_bahan)      AS estimasi_biaya
                FROM tb_detail_produksi dp
                JOIN tb_bahan b ON b.id_bahan = dp.id_bahan
                JOIN tb_produksi p ON p.id_produksi = dp.id_produksi
                WHERE $baseWhere $produkCond
                GROUP BY b.id_bahan
                ORDER BY estimasi_biaya DESC
            ")->getResultArray();

            // ═══════════════════════════════════════════════════════
            // 4. HPP AKTUAL per PRODUK
            // ═══════════════════════════════════════════════════════
            $hppAktual = $db->query("
                SELECT
                    pr.id_produk,
                    pr.kode_produk,
                    pr.nama_produk,
                    SUM(p.jumlah_produksi)          AS total_kemasan,
                    SUM(p.total_biaya_bahan)        AS hpp_bahan,
                    SUM(p.biaya_tenaga)             AS hpp_tenaga,
                    SUM(p.biaya_lain)               AS hpp_lain,
                    SUM(p.total_biaya)              AS hpp_total,
                    CASE WHEN SUM(p.jumlah_produksi) > 0
                        THEN ROUND(SUM(p.total_biaya) / SUM(p.jumlah_produksi), 2)
                        ELSE 0 END                  AS hpp_per_kemasan,
                    ROUND(AVG(p.hpp_per_unit), 2)   AS hpp_per_unit_avg
                FROM tb_produksi p
                JOIN tb_produk pr ON pr.id_produk = p.id_produk
                WHERE $baseWhere $produkCond
                GROUP BY pr.id_produk
                ORDER BY hpp_total DESC
            ")->getResultArray();

            // Enrich dengan detail bahan per produk
            foreach ($hppAktual as &$row) {
                $idPr = intval($row['id_produk']);
                $row['bahan_detail'] = $db->query("
                    SELECT
                        b.nama_bahan,
                        b.satuan_bahan              AS satuan,
                        SUM(dp.jumlah_total)        AS total_terpakai,
                        dp.harga_satuan_bahan       AS harga_per_satuan,
                        SUM(dp.subtotal_bahan)      AS subtotal_biaya
                    FROM tb_detail_produksi dp
                    JOIN tb_bahan b ON b.id_bahan = dp.id_bahan
                    JOIN tb_produksi p ON p.id_produksi = dp.id_produksi
                    WHERE $baseWhere AND p.id_produk = $idPr
                    GROUP BY b.id_bahan, dp.harga_satuan_bahan
                    ORDER BY subtotal_biaya DESC
                ")->getResultArray();
            }
            unset($row);

            // ═══════════════════════════════════════════════════════
            // 5. SUMMARY
            // ═══════════════════════════════════════════════════════
            $totalProduksi = array_sum(array_column($rekapPeriode, 'total_batch'));
            $totalKemasan  = array_sum(array_column($rekapPeriode, 'total_kemasan'));
            $totalHPP      = array_sum(array_column($rekapPeriode, 'hpp_total'));
            $jenisBahan    = count($pemakaianBahan);
            $hppPerKem     = $totalKemasan > 0 ? round($totalHPP / $totalKemasan, 2) : 0;

            // Produk list untuk dropdown filter
            $produkList = $db->query("
                SELECT id_produk AS id, kode_produk, nama_produk AS nama
                FROM tb_produk
                WHERE deleted_at IS NULL AND status_produk = 'aktif'
                ORDER BY nama_produk ASC
            ")->getResultArray();

            return $this->response->setJSON([
                'success'         => true,
                'rekap_periode'   => $rekapPeriode,
                'rekap_produk'    => $rekapProduk,
                'pemakaian_bahan' => $pemakaianBahan,
                'hpp_aktual'      => $hppAktual,
                'produk_list'     => $produkList,
                'summary'         => [
                    'total_produksi'  => $totalProduksi,
                    'total_kemasan'   => $totalKemasan,
                    'jenis_bahan'     => $jenisBahan,
                    'total_hpp'       => $totalHPP,
                    'hpp_per_kemasan' => $hppPerKem,
                ],
            ]);

        } catch (\Throwable $e) {
            log_message('error', '[LaporanProduksi] ' . $e->getMessage());
            return $this->response->setJSON([
                'success' => false,
                'error'   => $e->getMessage(),
            ]);
        }
    }
}