<?php

namespace App\Controllers;

use App\Models\ProduksiModel;

class Produksi extends \CodeIgniter\Controller
{
    protected ProduksiModel $model;

    public function __construct()
    {
        $this->model = new ProduksiModel();
    }

    // ----------------------------------------------------------------
    // GET /produksi
    // ----------------------------------------------------------------
    public function index(): string
    {
        return view('produksi/index');
    }

    // ----------------------------------------------------------------
    // GET /produksi/data
    // ----------------------------------------------------------------
    public function data()
    {
        try {
            $db = \Config\Database::connect();

            // Daftar produk aktif
            $produk = $db->table('tb_produk')
                ->select('id_produk AS id, kode_produk AS kode, nama_produk AS nama, stok_produk AS stok, harga_produk AS harga')
                ->where('status_produk', 'aktif')
                ->where('deleted_at IS NULL', null, false)
                ->orderBy('nama_produk', 'ASC')
                ->get()->getResultArray();

            $resep   = $this->model->getResepList();
            $list    = $this->model->getList();
            $summary = $this->model->getSummary();

            $mapped = array_map(function ($r) {
                return [
                    'id'           => $r['id_produksi'],
                    'kode'         => $r['kode_produksi'],
                    'tanggal'      => $r['tanggal_produksi'],
                    'status'       => $r['status_produksi'],
                    'jumlah_hasil' => $r['jumlah_produksi'],
                    'catatan'      => $r['catatan_produksi'],
                    'kode_produk'  => $r['kode_produk'],
                    'nama_produk'  => $r['nama_produk'],
                    'nama_resep'   => $r['nama_resep'],
                    'hpp_per_unit' => $r['hpp_per_unit'],
                    'bahan'        => array_map(fn($b) => [
                        'nama_bahan' => $b['nama_bahan'],
                        'jumlah'     => $b['jumlah_total'],
                        'satuan'     => $b['satuan_bahan'],
                    ], $r['bahan']),
                ];
            }, $list);

            return $this->response->setJSON([
                'success' => true,
                'produk'  => $produk,
                'resep'   => $resep,
                'list'    => $mapped,
                'summary' => $summary,
            ]);

        } catch (\Throwable $e) {
            log_message('error', '[Produksi::data] ' . $e->getMessage() . ' | ' . $e->getFile() . ':' . $e->getLine());
            return $this->response->setStatusCode(500)->setJSON([
                'success' => false,
                'error'   => ENVIRONMENT === 'development'
                    ? $e->getMessage() . ' (' . basename($e->getFile()) . ':' . $e->getLine() . ')'
                    : 'Gagal memuat data produksi. Hubungi administrator.',
            ]);
        }
    }

    // ----------------------------------------------------------------
    // POST /produksi/simpan
    // ----------------------------------------------------------------
    public function simpan()
    {
        try {
            $json = $this->request->getJSON(true);

            $namaResep = trim($json['nama_resep'] ?? '');
            $idProduk  = (int) ($json['id_produk'] ?? 0);
            $jumlah    = (int) ($json['jumlah_hasil'] ?? 0);
            $tanggal   = $json['tanggal'] ?? date('Y-m-d');
            $catatan   = $json['catatan'] ?? null;

            if (!$namaResep) {
                return $this->response->setJSON(['success' => false, 'error' => 'Pilih resep terlebih dahulu.']);
            }
            if (!$idProduk) {
                return $this->response->setJSON(['success' => false, 'error' => 'Produk yang dihasilkan wajib dipilih.']);
            }
            if ($jumlah < 1) {
                return $this->response->setJSON(['success' => false, 'error' => 'Jumlah hasil harus lebih dari 0.']);
            }

            $result = $this->model->simpan([
                'nama_resep'       => $namaResep,
                'id_produk'        => $idProduk,
                'jumlah_produksi'  => $jumlah,
                'tanggal_produksi' => $tanggal,
                'catatan_produksi' => $catatan,
            ]);

            return $this->response->setJSON($result);

        } catch (\Throwable $e) {
            log_message('error', '[Produksi::simpan] ' . $e->getMessage() . ' | ' . $e->getFile() . ':' . $e->getLine());
            return $this->response->setStatusCode(500)->setJSON([
                'success' => false,
                'error'   => ENVIRONMENT === 'development'
                    ? $e->getMessage()
                    : 'Terjadi kesalahan saat menyimpan produksi.',
            ]);
        }
    }

    // ----------------------------------------------------------------
    // POST /produksi/batalkan
    // ----------------------------------------------------------------
    public function batalkan()
    {
        try {
            $json = $this->request->getJSON(true);
            $id   = (int) ($json['id'] ?? 0);

            if (!$id) {
                return $this->response->setJSON(['success' => false, 'error' => 'ID produksi tidak valid.']);
            }

            return $this->response->setJSON($this->model->batalkan($id));

        } catch (\Throwable $e) {
            log_message('error', '[Produksi::batalkan] ' . $e->getMessage() . ' | ' . $e->getFile() . ':' . $e->getLine());
            return $this->response->setStatusCode(500)->setJSON([
                'success' => false,
                'error'   => ENVIRONMENT === 'development'
                    ? $e->getMessage()
                    : 'Terjadi kesalahan saat membatalkan produksi.',
            ]);
        }
    }
}