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

class Tabungan_model extends CI_Model {

    public function __construct() {
        parent::__construct();
    }

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

    public function get_all() {
        $this->db->select('tabungan.*, warga.nik, warga.no_kk, warga.tempat_lahir, warga.tanggal_lahir, users.nama_lengkap, users.no_hp');
        $this->db->from('tabungan');
        $this->db->join('warga', 'warga.id = tabungan.warga_id', 'left');
        $this->db->join('users', 'users.id = warga.user_id', 'left');
        $this->db->order_by('tabungan.id', 'DESC');
        return $this->db->get()->result();
    }

    public function get_by_warga($warga_id) {
        $this->db->select('tabungan.*');
        $this->db->from('tabungan');
        $this->db->where('tabungan.warga_id', $warga_id);
        return $this->db->get()->row();
    }

    public function get_by_warga_id_single($warga_id) {
        $this->db->select('tabungan.*, warga.nik, users.nama_lengkap, users.no_hp');
        $this->db->from('tabungan');
        $this->db->join('warga', 'warga.id = tabungan.warga_id', 'left');
        $this->db->join('users', 'users.id = warga.user_id', 'left');
        $this->db->where('tabungan.warga_id', $warga_id);
        return $this->db->get()->result();
    }

    public function create($data) {
        $this->db->insert('tabungan', $data);
        return $this->db->insert_id();
    }

    // ─────────────────────────────────────────────
    // TRANSAKSI
    // ─────────────────────────────────────────────

    public function ajukan_transaksi($data) {
        $data['tanggal_pengajuan'] = date('Y-m-d H:i:s');
        return $this->db->insert('transaksi_tabungan', $data);
    }

    /**
     * Get pending — join master_kas untuk tampil info kas di verifikasi
     */
    public function get_transaksi_pending() {
        $this->db->select('
            transaksi_tabungan.*,
            tabungan.warga_id,
            tabungan.saldo as saldo_saat_ini,
            tabungan.jenis_tabungan,
            warga.nik,
            users.nama_lengkap,
            users.no_hp,
            mk.nama  as nama_kas,
            mk.kode  as kode_kas,
            mk.warna as warna_kas,
            mk.icon  as icon_kas
        ');
        $this->db->from('transaksi_tabungan');
        $this->db->join('tabungan', 'tabungan.id = transaksi_tabungan.tabungan_id', 'left');
        $this->db->join('warga', 'warga.id = tabungan.warga_id', 'left');
        $this->db->join('users', 'users.id = warga.user_id', 'left');
        $this->db->join('master_kas mk', 'mk.id = transaksi_tabungan.master_kas_id', 'left');
        $this->db->where('transaksi_tabungan.status', 'pending');
        $this->db->order_by('transaksi_tabungan.tanggal_pengajuan', 'DESC');
        return $this->db->get()->result();
    }

    /**
     * Get riwayat transaksi satu tabungan — join master_kas
     */
    public function get_transaksi($tabungan_id) {
        $this->db->select('
            transaksi_tabungan.*,
            users.nama_lengkap as nama_petugas,
            mk.nama  as nama_kas,
            mk.kode  as kode_kas,
            mk.warna as warna_kas,
            mk.icon  as icon_kas
        ');
        $this->db->from('transaksi_tabungan');
        $this->db->join('users', 'users.id = transaksi_tabungan.petugas_id', 'left');
        $this->db->join('master_kas mk', 'mk.id = transaksi_tabungan.master_kas_id', 'left');
        $this->db->where('tabungan_id', $tabungan_id);
        $this->db->order_by('tanggal_pengajuan', 'DESC');
        return $this->db->get()->result();
    }

    // ─────────────────────────────────────────────
    // VERIFIKASI
    // ─────────────────────────────────────────────

    /**
     * Setujui transaksi:
     * - Update saldo tabungan warga
     * - Jika SETOR: catat juga ke kas_rt + update saldo master_kas
     * - Jika TARIK: tidak menyentuh master_kas (wewenang admin)
     */
   public function setujui_transaksi($transaksi_id, $admin_id, $catatan = '', $kas_id = null) {
    $this->db->trans_start();

    $transaksi = $this->db->get_where('transaksi_tabungan',
        ['id' => $transaksi_id, 'status' => 'pending'])->row();

    if (!$transaksi) {
        $this->db->trans_complete();
        return false;
    }

    $tabungan = $this->db->get_where('tabungan', ['id' => $transaksi->tabungan_id])->row();

    if (!$tabungan) {
        $this->db->trans_complete();
        return false;
    }

    $saldo_sebelum = $tabungan->saldo;
    $saldo_sesudah = $transaksi->jenis_transaksi === 'setor'
        ? $saldo_sebelum + $transaksi->nominal
        : $saldo_sebelum - $transaksi->nominal;

    // 1. Update status transaksi tabungan
    $this->db->where('id', $transaksi_id);
    $this->db->update('transaksi_tabungan', [
        'status'             => 'disetujui',
        'saldo_sebelum'      => $saldo_sebelum,
        'saldo_sesudah'      => $saldo_sesudah,
        'admin_id'           => $admin_id,
        'catatan_admin'      => $catatan,
        'tanggal_verifikasi' => date('Y-m-d H:i:s'),
    ]);

    // 2. Update saldo tabungan warga
    $this->db->where('id', $transaksi->tabungan_id);
    $this->db->update('tabungan', ['saldo' => $saldo_sesudah]);

    // Ambil info warga (dipakai kedua jenis transaksi)
    $warga_info = $this->db->select('warga.*, users.nama_lengkap')
        ->from('warga')
        ->join('users', 'users.id = warga.user_id', 'left')
        ->where('warga.id', $tabungan->warga_id)
        ->get()->row();
    $nama_warga = $warga_info ? $warga_info->nama_lengkap : 'Warga';

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

    // 3. Jika SETOR → catat pemasukan ke kas_rt
    if ($transaksi->jenis_transaksi === 'setor' && !empty($transaksi->master_kas_id)) {
        $this->db->insert('kas_rt', [
            'tanggal'       => date('Y-m-d'),
            'jenis'         => 'pemasukan',
            'kategori'      => 'Setoran Tabungan',
            'master_kas_id' => $transaksi->master_kas_id,
            'nominal'       => $transaksi->nominal,
            'keterangan'    => 'Setoran tabungan a.n. ' . $nama_warga . ' (Tabungan ID: ' . $tabungan->id . ')',
            'input_oleh'    => $admin_id,
        ]);
        $this->Master_kas_model->update_saldo($transaksi->master_kas_id);
    }

    // 4. Jika TARIK → catat pengeluaran ke kas_rt ← BARU
    if ($transaksi->jenis_transaksi === 'tarik' && !empty($kas_id)) {
        $this->db->insert('kas_rt', [
            'tanggal'       => date('Y-m-d'),
            'jenis'         => 'pengeluaran',
            'kategori'      => 'Penarikan Tabungan',
            'master_kas_id' => $kas_id,
            'nominal'       => $transaksi->nominal,
            'keterangan'    => 'Penarikan tabungan a.n. ' . $nama_warga . ' (Tabungan ID: ' . $tabungan->id . ')',
            'input_oleh'    => $admin_id,
        ]);
        $this->Master_kas_model->update_saldo($kas_id);
    }

    $this->db->trans_complete();
    return $this->db->trans_status();
}

    public function get_total_saldo() {
    $this->db->select_sum('saldo');
    $query = $this->db->get('tabungan');
    return $query->row()->saldo ?: 0;
}

public function count_penabung() {
    return $this->db->where('saldo >', 0)->count_all_results('tabungan');
}

public function get_saldo_by_warga($warga_id) {
    $this->db->select_sum('saldo');
    $this->db->where('warga_id', $warga_id);
    $query = $this->db->get('tabungan');
    return $query->row()->saldo ?: 0;
}

    public function tolak_transaksi($transaksi_id, $admin_id, $catatan = '') {
        $this->db->where('id', $transaksi_id);
        return $this->db->update('transaksi_tabungan', [
            'status'             => 'ditolak',
            'admin_id'           => $admin_id,
            'catatan_admin'      => $catatan,
            'tanggal_verifikasi' => date('Y-m-d H:i:s'),
        ]);
    }

    public function get_transaksi_disetujui($tabungan_id) {
    $this->db
        ->select('tt.*, mk.nama AS nama_kas')
        ->from('transaksi_tabungan tt')
        ->join('master_kas mk', 'mk.id = tt.master_kas_id', 'left')
        ->where('tt.tabungan_id', $tabungan_id)
        ->where('tt.status', 'disetujui')
        ->order_by('tt.tanggal_transaksi', 'ASC')
        ->order_by('tt.id', 'ASC');

    return $this->db->get()->result();
}

// Ambil SEMUA transaksi (semua status) — alternatif tampilkan pending & ditolak juga
public function get_transaksi_semua($tabungan_id) {
    $this->db
        ->select('tt.*, mk.nama AS nama_kas')
        ->from('transaksi_tabungan tt')
        ->join('master_kas mk', 'mk.id = tt.master_kas_id', 'left')
        ->where('tt.tabungan_id', $tabungan_id)
        ->order_by('tt.tanggal_transaksi', 'ASC')
        ->order_by('tt.id', 'ASC');

    return $this->db->get()->result();
}



}