<?php

namespace App\Controllers;

use App\Models\ResepModel;

class Resep extends BaseController
{
    protected ResepModel $resepModel;

    public function __construct()
    {
        $this->resepModel = new ResepModel();
    }

    // ── GET /resep ───────────────────────────────────────────────────
    public function index(): string
    {
        return view('resep/index', [
            'resep' => $this->resepModel->getResepWithDetails(),
        ]);
    }

    // ── GET /resep/detail/{id}  (AJAX) ──────────────────────────────
    public function detail($id = null)
    {
        if (! $this->request->isAJAX()) return redirect()->to('/resep');
        if (! $id)                       return $this->jsonError('ID tidak valid', 400);

        try {
            $resep = $this->resepModel->getResepDetail((int) $id);
            if (! $resep) return $this->jsonError('Resep tidak ditemukan', 404);

            return $this->response->setJSON(['success' => true, 'data' => $resep]);
        } catch (\Exception $e) {
            return $this->jsonError($e->getMessage(), 500);
        }
    }

    // ── POST /resep/store  (AJAX) ────────────────────────────────────
    public function store()
    {
        if (! $this->request->isAJAX()) return redirect()->to('/resep');

        try {
            $json      = $this->request->getJSON();
            $nama      = trim($json->nama_resep    ?? '');
            $idProduk  = (int) ($json->id_produk   ?? 0);
            $catatan   = trim($json->catatan_resep ?? '');
            $items     = $json->items              ?? [];

            if (! $nama)                              return $this->jsonError('Nama resep harus diisi', 400);
            if (! $idProduk)                          return $this->jsonError('Pilih produk untuk resep ini', 400);
            if (empty($items) || ! is_array($items))  return $this->jsonError('Minimal 1 bahan harus ditambahkan', 400);

            $itemArr = [];
            foreach ($items as $item) {
                if (empty($item->id_bahan) || (float)($item->jumlah_bahan ?? 0) <= 0) {
                    return $this->jsonError('Lengkapi semua detail bahan', 400);
                }
                $itemArr[] = [
                    'id_bahan'     => (int) $item->id_bahan,
                    'jumlah_bahan' => (float) $item->jumlah_bahan,
                ];
            }

            $id = $this->resepModel->simpanResep($nama, $idProduk, $catatan, $itemArr);

            return $this->response->setJSON([
                'success'  => true,
                'message'  => 'Resep berhasil disimpan',
                'id_resep' => $id,
            ]);
        } catch (\Exception $e) {
            return $this->jsonError('Error: ' . $e->getMessage(), 500);
        }
    }

    // ── POST /resep/update/{id}  (AJAX) ─────────────────────────────
    // id_resep di header TIDAK berubah → FK tb_produksi tetap valid
    public function update($id = null)
    {
        if (! $this->request->isAJAX()) return redirect()->to('/resep');
        if (! $id)                       return $this->jsonError('ID tidak valid', 400);

        try {
            $json     = $this->request->getJSON();
            $nama     = trim($json->nama_resep    ?? '');
            $idProduk = (int) ($json->id_produk   ?? 0);
            $catatan  = trim($json->catatan_resep ?? '');
            $items    = $json->items              ?? [];

            if (! $nama)                             return $this->jsonError('Nama resep harus diisi', 400);
            if (! $idProduk)                         return $this->jsonError('Pilih produk untuk resep ini', 400);
            if (empty($items) || ! is_array($items)) return $this->jsonError('Minimal 1 bahan harus ditambahkan', 400);

            if (! $this->resepModel->find((int) $id)) {
                return $this->jsonError('Resep tidak ditemukan', 404);
            }

            $itemArr = [];
            foreach ($items as $item) {
                if (empty($item->id_bahan) || (float)($item->jumlah_bahan ?? 0) <= 0) continue;
                $itemArr[] = [
                    'id_bahan'     => (int) $item->id_bahan,
                    'jumlah_bahan' => (float) $item->jumlah_bahan,
                ];
            }

            if (empty($itemArr)) return $this->jsonError('Minimal 1 bahan harus ditambahkan', 400);

            // updateResep hanya mengubah kolom header & mengganti detail
            // id_resep tidak pernah berubah → aman untuk FK produksi
            $this->resepModel->updateResep((int) $id, $nama, $idProduk, $catatan, $itemArr);

            return $this->response->setJSON([
                'success' => true,
                'message' => 'Resep berhasil diperbarui',
            ]);
        } catch (\Exception $e) {
            return $this->jsonError($e->getMessage(), 500);
        }
    }

    // ── POST /resep/delete/{id}  (AJAX) ─────────────────────────────
    public function delete($id = null)
    {
        if (! $this->request->isAJAX() && $this->request->getMethod() !== 'post') {
            return redirect()->to('/resep');
        }
        if (! $id) return $this->jsonError('ID tidak valid', 400);

        try {
            if (! $this->resepModel->find((int) $id)) {
                return $this->jsonError('Resep tidak ditemukan', 404);
            }

            // Cek apakah resep dipakai di produksi — jika iya, tolak hapus
            $db       = \Config\Database::connect();
            $dipakai  = $db->table('tb_produksi')
                ->where('id_resep', $id)
                ->where('deleted_at IS NULL', null, false)
                ->countAllResults();

            if ($dipakai > 0) {
                return $this->jsonError(
                    'Resep tidak dapat dihapus karena sudah digunakan di ' . $dipakai . ' data produksi.',
                    409
                );
            }

            $this->resepModel->hapusResep((int) $id);

            return $this->response->setJSON([
                'success' => true,
                'message' => 'Resep berhasil dihapus',
            ]);
        } catch (\Exception $e) {
            return $this->jsonError($e->getMessage(), 500);
        }
    }

    // ── GET /resep/data  (AJAX) ──────────────────────────────────────
    public function data()
    {
        if (! $this->request->isAJAX()) return $this->jsonError('Invalid request', 400);

        try {
            return $this->response->setJSON([
                'success' => true,
                'list'    => $this->resepModel->getResepWithDetails(),
            ]);
        } catch (\Exception $e) {
            return $this->jsonError($e->getMessage(), 500);
        }
    }

    private function jsonError(string $msg, int $code = 400)
    {
        return $this->response
            ->setJSON(['success' => false, 'error' => $msg])
            ->setStatusCode($code);
    }
}