<?php

namespace App\Controllers;

use App\Models\PupukModel;
use App\Models\PupukMasukModel;

class PupukMasuk extends BaseController
{
    protected $pupukM;
    protected $pupukMasukM;
    protected $db;

    public function __construct()
    {
        $this->pupukM = new PupukModel();
        $this->pupukMasukM = new PupukMasukModel();
        $this->db = \Config\Database::connect();
    }

    public function index()
    {
        // Ambil data log pupuk masuk di-join dengan nama pupuknya
        $builder = $this->db->table('pupuk_masuk');
        $builder->select('pupuk_masuk.*, pupuk.nama_pupuk, pupuk.kode_pupuk');
        $builder->join('pupuk', 'pupuk.id_pupuk = pupuk_masuk.id_pupuk');
        $builder->orderBy('pupuk_masuk.tanggal_masuk', 'DESC');
        
        $data = [
            'title'       => 'Log Riwayat Pupuk Masuk (Datang)',
            'pupuk_masuk' => $builder->get()->getResultArray(),
            'pupuk'       => $this->pupukM->findAll() 
        ];

        return view('pupuk_masuk/index', $data);
    }

    public function simpan()
    {
        $id_pupuk = $this->request->getPost('id_pupuk');
        $jumlah   = $this->request->getPost('jumlah_masuk');

        $this->db->transStart();

        // 1. Masukkan data ke log riwayat pupuk masuk
        $this->pupukMasukM->save([
            'id_pupuk'      => $id_pupuk,
            'jumlah_masuk'  => $jumlah,
            'tanggal_masuk' => $this->request->getPost('tanggal_masuk'),
            'asal_pupuk'    => $this->request->getPost('asal_pupuk'),
        ]);

        // 2. Tambah stok_global di tabel pupuk secara otomatis
        $this->db->table('pupuk')
                 ->where('id_pupuk', $id_pupuk)
                 ->set('stok_global', 'stok_global + ' . (float)$jumlah, false)
                 ->update();

        $this->db->transComplete();

        if ($this->db->transStatus() === false) {
            return redirect()->to('/pupukmasuk')->with('error', 'Gagal mencatat data pupuk masuk.');
        }

        return redirect()->to('/pupukmasuk')->with('success', 'Data pasokan masuk <b>berhasil dicatat</b>, stok gudang bertambah.');
    }

    // FUNGSI BARU: MEMPROSES PERUBAHAN PASOKAN & KALKULASI ULANG STOK
    public function update($id)
    {
        $oldLog = $this->pupukMasukM->find($id);
        if (!$oldLog) {
            return redirect()->to('/pupukmasuk')->with('error', 'Data log pasokan tidak ditemukan.');
        }

        $new_id_pupuk = $this->request->getPost('id_pupuk');
        $new_jumlah   = $this->request->getPost('jumlah_masuk');

        $this->db->transStart();

        // 1. Batalkan (Kurangi) stok dari pupuk lama menggunakan nilai kuantitas log yang lama
        $this->db->table('pupuk')
                 ->where('id_pupuk', $oldLog['id_pupuk'])
                 ->set('stok_global', 'stok_global - ' . (float)$oldLog['jumlah_masuk'], false)
                 ->update();

        // 2. Tambahkan kuantitas baru ke stok jenis pupuk yang baru terpilih
        $this->db->table('pupuk')
                 ->where('id_pupuk', $new_id_pupuk)
                 ->set('stok_global', 'stok_global + ' . (float)$new_jumlah, false)
                 ->update();

        // 3. Perbarui baris log riwayat datanya
        $this->pupukMasukM->update($id, [
            'id_pupuk'      => $new_id_pupuk,
            'jumlah_masuk'  => $new_jumlah,
            'tanggal_masuk' => $this->request->getPost('tanggal_masuk'),
            'asal_pupuk'    => $this->request->getPost('asal_pupuk'),
        ]);

        $this->db->transComplete();

        if ($this->db->transStatus() === false) {
            return redirect()->to('/pupukmasuk')->with('error', 'Gagal memperbarui data log pasokan.');
        }

        return redirect()->to('/pupukmasuk')->with('success', 'Data pasokan berhasil <b>diperbarui</b> dan stok global disesuaikan.');
    }

    // FUNGSI BARU: MENGHAPUS LOG PASOKAN & PEMOTONGAN STOK OTOMATIS
    public function hapus($id)
    {
        $log = $this->pupukMasukM->find($id);
        if (!$log) {
            return redirect()->to('/pupukmasuk')->with('error', 'Data log pasokan tidak ditemukan.');
        }

        $this->db->transStart();

        // 1. Kurangi jumlah kuantitas log dari stok global (karena log dibatalkan/dihapus)
        $this->db->table('pupuk')
                 ->where('id_pupuk', $log['id_pupuk'])
                 ->set('stok_global', 'stok_global - ' . (float)$log['jumlah_masuk'], false)
                 ->update();

        // 2. Hapus permanen data riwayat lognya
        $this->pupukMasukM->delete($id);

        $this->db->transComplete();

        if ($this->db->transStatus() === false) {
            return redirect()->to('/pupukmasuk')->with('error', 'Gagal memproses penghapusan data log.');
        }

        return redirect()->to('/pupukmasuk')->with('success', 'Data riwayat pasokan berhasil <b>dihapus</b>, kuantitas stok telah dikurangi.');
    }
}