<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Rencana_pembelian_model extends CI_Model {

    // ─────────────────────────────────────────────
    // READ
    // ─────────────────────────────────────────────

    public function get_all($status = null) {
        // Cek apakah kolom disetujui_oleh sudah ada
        $has_disetujui = $this->db->field_exists('disetujui_oleh', 'rencana_pembelian');
        $has_satuan    = $this->db->field_exists('satuan', 'rencana_pembelian');
        $has_kode      = $this->db->field_exists('kode_rencana', 'rencana_pembelian');

        if ($has_disetujui) {
            $this->db->select('rp.*, u1.nama_lengkap AS nama_pengaju, u2.nama_lengkap AS nama_penyetuju');
            $this->db->join('users u2', 'u2.id = rp.disetujui_oleh', 'left');
        } else {
            $this->db->select('rp.*, u1.nama_lengkap AS nama_pengaju, NULL AS nama_penyetuju');
        }
        $this->db->from('rencana_pembelian rp');
        $this->db->join('users u1', 'u1.id = rp.diajukan_oleh', 'left');

        if ($status) {
            if (is_array($status)) {
                $this->db->where_in('rp.status', $status);
            } else {
                $this->db->where('rp.status', $status);
            }
        }
        $this->db->order_by('rp.created_at', 'DESC');
        return $this->db->get()->result();
    }

    public function get_by_id($id) {
        $has_disetujui  = $this->db->field_exists('disetujui_oleh', 'rencana_pembelian');
        $has_master_kas = $this->db->field_exists('master_kas_id', 'rencana_pembelian');

        if ($has_disetujui) {
            $this->db->select('rp.*, u1.nama_lengkap AS nama_pengaju, u2.nama_lengkap AS nama_penyetuju');
            $this->db->join('users u2', 'u2.id = rp.disetujui_oleh', 'left');
        } else {
            $this->db->select('rp.*, u1.nama_lengkap AS nama_pengaju, NULL AS nama_penyetuju');
        }
        $this->db->from('rencana_pembelian rp');
        $this->db->join('users u1', 'u1.id = rp.diajukan_oleh', 'left');
        if ($has_master_kas) {
            $this->db->join('master_kas mk', 'mk.id = rp.master_kas_id', 'left');
            $this->db->select('mk.nama AS nama_kas, mk.kode AS kode_kas');
        }
        $this->db->where('rp.id', $id);
        return $this->db->get()->row();
    }

    public function get_stats() {
        $stats = [];
        $stats['total']        = $this->db->count_all('rencana_pembelian');
        $stats['direncanakan'] = $this->db->where('status', 'direncanakan')->count_all_results('rencana_pembelian');
        $stats['disetujui']    = $this->db->where('status', 'disetujui')->count_all_results('rencana_pembelian');
        $stats['terbeli']      = $this->db->where('status', 'terbeli')->count_all_results('rencana_pembelian');
        $stats['hibah']        = $this->db->where('status', 'hibah')->count_all_results('rencana_pembelian');
        $stats['dibatalkan']   = $this->db->where('status', 'dibatalkan')->count_all_results('rencana_pembelian');

        $this->db->select('SUM(estimasi_harga * jumlah) AS total_estimasi', FALSE);
        $this->db->where_in('status', ['direncanakan', 'disetujui']);
        $row = $this->db->get('rencana_pembelian')->row();
        $stats['total_estimasi_pending'] = $row->total_estimasi ?? 0;

        return $stats;
    }

    // ─────────────────────────────────────────────
    // INSERT / UPDATE
    // ─────────────────────────────────────────────

    public function insert($data) {
        // Auto-generate kode jika kosong
        if (empty($data['kode_rencana'])) {
            $data['kode_rencana'] = $this->_generate_kode();
        }
        $this->db->insert('rencana_pembelian', $data);
        return $this->db->insert_id();
    }

    public function update($id, $data) {
        $this->db->where('id', $id);
        return $this->db->update('rencana_pembelian', $data);
    }

    public function delete($id) {
        $this->db->where('id', $id);
        return $this->db->delete('rencana_pembelian');
    }

    // ─────────────────────────────────────────────
    // REALISASI: TERBELI
    // Otomatis: buat pengeluaran kas → insert inventaris → update status
    // ─────────────────────────────────────────────

    public function realisasi_terbeli($id, $post, $user_id) {
        $item = $this->get_by_id($id);
        if (!$item) return false;

        $this->load->model('Kas_model');
        $this->load->model('Master_kas_model');
        $this->load->model('Inventaris_model');

        $harga      = (int) str_replace('.', '', $post['harga_realisasi']);
        $master_kas = $post['master_kas_id'];
        $tanggal    = $post['tanggal_realisasi'];

        // 1. Cek saldo kas
        $saldo = $this->Master_kas_model->hitung_saldo($master_kas);
        if ($saldo < $harga) {
            return ['error' => 'Saldo kas tidak mencukupi! Saldo tersedia: Rp ' . number_format($saldo, 0, ',', '.')];
        }

        // 2. Buat transaksi pengeluaran kas
        $kas_data = [
            'tanggal'       => $tanggal,
            'jenis'         => 'pengeluaran',
            'kategori'      => 'Pembelian Inventaris',
            'nominal'       => $harga,
            'keterangan'    => 'Pembelian: ' . $item->nama_barang . ' (' . $item->kode_rencana . ')',
            'master_kas_id' => $master_kas,
            'input_oleh'    => $user_id,
        ];
        $this->Kas_model->insert($kas_data);
        $kas_id = $this->db->insert_id();

        // 3. Insert ke inventaris
        $inv_data = [
            'kode_barang'       => $this->_generate_kode_inventaris(),
            'nama_barang'       => $item->nama_barang,
            'kategori'          => $item->kategori,
            'jumlah'            => $item->jumlah,
            'satuan'            => $item->satuan,
            'kondisi'           => 'baik',
            'lokasi'            => $post['lokasi'] ?? '-',
            'tanggal_pembelian' => $tanggal,
            'harga_pembelian'   => $harga,
            'sumber_dana'       => 'Kas RT',
            'keterangan'        => 'Dari rencana pembelian: ' . $item->kode_rencana,
            'foto'              => '',
        ];
        $inventaris_id = $this->Inventaris_model->insert($inv_data);

        // 4. Update status rencana
        $this->update($id, [
            'status'            => 'terbeli',
            'tanggal_realisasi' => $tanggal,
            'harga_realisasi'   => $harga,
            'master_kas_id'     => $master_kas,
            'kas_id'            => $kas_id,
            'inventaris_id'     => $inventaris_id,
            'disetujui_oleh'    => $user_id,
        ]);

        return ['success' => true, 'inventaris_id' => $inventaris_id];
    }

    // ─────────────────────────────────────────────
    // REALISASI: HIBAH
    // Tidak potong kas → insert inventaris → update status
    // ─────────────────────────────────────────────

    public function realisasi_hibah($id, $post, $user_id) {
        $item = $this->get_by_id($id);
        if (!$item) return false;

        $this->load->model('Inventaris_model');

        $tanggal = $post['tanggal_realisasi'];

        // 1. Insert ke inventaris
        $inv_data = [
            'kode_barang'       => $this->_generate_kode_inventaris(),
            'nama_barang'       => $item->nama_barang,
            'kategori'          => $item->kategori,
            'jumlah'            => $item->jumlah,
            'satuan'            => $item->satuan,
            'kondisi'           => 'baik',
            'lokasi'            => $post['lokasi'] ?? '-',
            'tanggal_pembelian' => $tanggal,
            'harga_pembelian'   => 0,
            'sumber_dana'       => 'Hibah',
            'keterangan'        => 'Hibah dari: ' . ($post['pemberi_hibah'] ?? '-') . ' | Ref: ' . $item->kode_rencana,
            'foto'              => '',
        ];
        $inventaris_id = $this->Inventaris_model->insert($inv_data);

        // 2. Update status rencana
        $this->update($id, [
            'status'            => 'hibah',
            'tanggal_realisasi' => $tanggal,
            'harga_realisasi'   => 0,
            'pemberi_hibah'     => $post['pemberi_hibah'] ?? '-',
            'inventaris_id'     => $inventaris_id,
            'disetujui_oleh'    => $user_id,
        ]);

        return ['success' => true, 'inventaris_id' => $inventaris_id];
    }

    // ─────────────────────────────────────────────
    // HELPERS
    // ─────────────────────────────────────────────

    private function _generate_kode() {
        $prefix = 'RP' . date('Ym');
        $last = $this->db
            ->like('kode_rencana', $prefix, 'after')
            ->order_by('id', 'DESC')
            ->limit(1)
            ->get('rencana_pembelian')
            ->row();
        $urut = $last ? ((int) substr($last->kode_rencana, -4)) + 1 : 1;
        return $prefix . str_pad($urut, 4, '0', STR_PAD_LEFT);
    }

    private function _generate_kode_inventaris() {
        $prefix = 'INV' . date('Y');
        $last = $this->db
            ->like('kode_barang', $prefix, 'after')
            ->order_by('id', 'DESC')
            ->limit(1)
            ->get('inventaris')
            ->row();
        $urut = $last ? ((int) substr($last->kode_barang, -4)) + 1 : 1;
        return $prefix . str_pad($urut, 4, '0', STR_PAD_LEFT);
    }
}