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

class Bansos extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('Bansos_model', 'bansos_model');
        $this->load->library(['session', 'form_validation']);
        $this->load->helper(['url', 'form']);
        if (!$this->session->userdata('user_id')) redirect('auth/login');
    }

    private function _is_admin() {
        return $this->session->userdata('role') === 'admin';
    }

    private function _render($view, $data = []) {
        $data['is_admin']            = $this->_is_admin();
        $data['count_polling_aktif'] = $this->db->where('status','aktif')->count_all_results('polling');
        $this->load->view('templates/header', $data);
        $this->load->view($view, $data);
        $this->load->view('templates/footer', $data);
    }

    /**
     * Ambil warga_id milik user yang sedang login.
     * Cek session dulu; jika kosong, query dari tabel users → simpan ke session.
     */
    private function _get_warga_id() {
        $warga_id = $this->session->userdata('warga_id');

        if (!$warga_id) {
            $user_id = $this->session->userdata('user_id');
            $user    = $this->db->select('warga_id')
                                ->where('id', $user_id)
                                ->get('users')
                                ->row();

            if ($user && $user->warga_id) {
                $warga_id = $user->warga_id;
                $this->session->set_userdata('warga_id', $warga_id);
            }
        }

        return $warga_id ?: null;
    }

    // ── INDEX ─────────────────────────────────────────────────
    public function index() {
        $tahun  = $this->input->get('tahun');
        $jenis  = $this->input->get('jenis');
        $status = $this->input->get('status');
        $q      = $this->input->get('q');

        if ($this->_is_admin()) {
            $bansos = $this->bansos_model->get_all($tahun, $jenis, $status, $q);
        } else {
            $warga_id = $this->_get_warga_id();
            $bansos   = $warga_id
                ? $this->bansos_model->get_by_warga($warga_id, $tahun)
                : [];
        }

        $data = [
            'bansos'            => $bansos,
            'total_penerima'    => $this->bansos_model->count_penerima(),
            'total_aktif'       => $this->bansos_model->count_by_status('aktif'),
            'total_ditinjau'    => $this->bansos_model->count_by_status('ditinjau'),
            'total_jenis_aktif' => 5,
            'title'             => 'Bantuan Sosial Warga',
        ];
        $this->_render('bansos/index', $data);
    }

    // ── TAMBAH FORM ───────────────────────────────────────────
    public function tambah() {
        if (!$this->_is_admin()) show_error('Akses ditolak.', 403);
        $this->_render('bansos/form', ['edit_mode' => false]);
    }

    // ── SIMPAN ────────────────────────────────────────────────
    public function simpan() {
        if (!$this->_is_admin()) show_error('Akses ditolak.', 403);

        $this->form_validation->set_rules('warga_id', 'Warga',  'required|numeric');
        $this->form_validation->set_rules('tahun',    'Tahun',  'required|numeric|min_length[4]|max_length[4]');
        $this->form_validation->set_rules('status',   'Status', 'required|in_list[aktif,nonaktif,ditinjau]');

        $valid_jenis = ['blt','sembako','pkh','bpnt','lansia','lainnya'];
        $jenis_raw   = $this->input->post('jenis_bantuan');

        $restore = [
            'edit_mode'     => false,
            'post_nama'     => $this->input->post('nama_cari'),
            'post_warga_id' => $this->input->post('warga_id'),
            'post_nik'      => $this->input->post('nik_display'),
            'post_nokk'     => $this->input->post('nokk_display'),
        ];

        if (!$this->form_validation->run()) {
            return $this->_render('bansos/form', $restore);
        }

        if (empty($jenis_raw) || !is_array($jenis_raw)) {
            $this->session->set_flashdata('error', 'Pilih minimal satu jenis bantuan.');
            return $this->_render('bansos/form', $restore);
        }

        $jenis    = array_values(array_filter($jenis_raw, fn($j) => in_array($j, $valid_jenis)));
        $warga_id = (int)$this->input->post('warga_id');
        $tahun    = $this->input->post('tahun');

        if ($this->bansos_model->get_by_warga_tahun($warga_id, $tahun)) {
            $this->session->set_flashdata('error', 'Warga ini sudah memiliki data bantuan untuk tahun '.$tahun.'. Gunakan fitur Edit.');
            return $this->_render('bansos/form', $restore);
        }

        $this->bansos_model->insert([
            'warga_id'      => $warga_id,
            'jenis_bantuan' => json_encode($jenis, JSON_UNESCAPED_UNICODE),
            'tahun'         => $tahun,
            'status'        => $this->input->post('status'),
            'keterangan'    => $this->input->post('keterangan', true),
            'dicatat_oleh'  => $this->session->userdata('user_id'),
        ]);

        $this->session->set_flashdata('success', 'Data penerima bantuan berhasil ditambahkan.');
        redirect('bansos');
    }

    // ── EDIT FORM ─────────────────────────────────────────────
    public function edit($id = null) {
        if (!$this->_is_admin()) show_error('Akses ditolak.', 403);
        if (!$id) redirect('bansos');

        $item = $this->bansos_model->get_by_id_with_warga($id);
        if (!$item) show_404();

        $this->_render('bansos/form', ['edit_mode' => true, 'item' => $item]);
    }

    // ── UPDATE ────────────────────────────────────────────────
    public function update($id = null) {
        if (!$this->_is_admin()) show_error('Akses ditolak.', 403);
        if (!$id) redirect('bansos');

        $item = $this->bansos_model->get_by_id_with_warga($id);
        if (!$item) show_404();

        $valid_jenis = ['blt','sembako','pkh','bpnt','lansia','lainnya'];
        $jenis_raw   = $this->input->post('jenis_bantuan');

        if (empty($jenis_raw) || !is_array($jenis_raw)) {
            $this->session->set_flashdata('error', 'Pilih minimal satu jenis bantuan.');
            return redirect('bansos/edit/'.$id);
        }

        $jenis = array_values(array_filter($jenis_raw, fn($j) => in_array($j, $valid_jenis)));

        $this->bansos_model->update($id, [
            'jenis_bantuan' => json_encode($jenis, JSON_UNESCAPED_UNICODE),
            'tahun'         => $this->input->post('tahun'),
            'status'        => $this->input->post('status'),
            'keterangan'    => $this->input->post('keterangan', true),
        ]);

        $this->session->set_flashdata('success', 'Data bantuan berhasil diperbarui.');
        redirect('bansos');
    }

    // ── HAPUS ─────────────────────────────────────────────────
    public function hapus($id = null) {
        if (!$this->_is_admin()) show_error('Akses ditolak.', 403);
        if (!$id) redirect('bansos');

        $this->bansos_model->delete($id);
        $this->session->set_flashdata('success', 'Data penerima bantuan berhasil dihapus.');
        redirect('bansos');
    }

    // ── RIWAYAT per warga ─────────────────────────────────────
    public function riwayat($warga_id = null) {
        if (!$this->_is_admin()) show_error('Akses ditolak.', 403);
        if (!$warga_id) redirect('bansos');

        $riwayat = $this->bansos_model->get_by_warga($warga_id);

        // Ambil data warga beserta no_kk dari kartu_keluarga
        $warga = $this->db
                      ->select('w.*, kk.no_kk')
                      ->from('warga w')
                      ->join('kartu_keluarga kk', 'kk.id = w.kk_id', 'left')
                      ->where('w.id', (int)$warga_id)
                      ->get()
                      ->row();

        if (!$warga) show_404();

        $this->_render('bansos/riwayat', [
            'riwayat' => $riwayat,
            'warga'   => $warga,
            'title'   => 'Riwayat Bantuan – '.$warga->nama_lengkap,
        ]);
    }

    // ── CATAT UNDANGAN ────────────────────────────────────────
    public function catat_undangan() {
        if (!$this->_is_admin()) show_error('Akses ditolak.', 403);

        $bansos_id  = (int)$this->input->post('bansos_id');
        $warga_id   = (int)$this->input->post('warga_id');
        $tanggal    = $this->input->post('tanggal');
        $kehadiran  = $this->input->post('kehadiran') ?: 'menunggu';
        $keterangan = $this->input->post('keterangan', true);

        if (!$bansos_id || !$tanggal) {
            $this->session->set_flashdata('error', 'Data tidak lengkap. Pilih data bantuan dan tanggal undangan.');
            return redirect('bansos/riwayat/'.$warga_id);
        }

        // Validasi kehadiran
        $valid_kehadiran = ['hadir', 'tidak_hadir', 'menunggu'];
        if (!in_array($kehadiran, $valid_kehadiran)) {
            $kehadiran = 'menunggu';
        }

        $item = $this->bansos_model->get_by_id_with_warga($bansos_id);
        if (!$item) show_404();

        // Pastikan bansos ini milik warga yang benar
        if ((int)$item->warga_id !== $warga_id) {
            $this->session->set_flashdata('error', 'Data tidak valid.');
            return redirect('bansos/riwayat/'.$warga_id);
        }

        // Ambil array undangan yang sudah ada, tambah entri baru
        $undangan   = json_decode($item->undangan ?? '[]', true) ?: [];
        $undangan[] = [
            'tanggal'      => $tanggal,
            'kehadiran'    => $kehadiran,
            'keterangan'   => $keterangan,
            'dicatat_at'   => date('Y-m-d H:i:s'),
            'dicatat_oleh' => (int)$this->session->userdata('user_id'),
        ];

        // Urutkan berdasarkan tanggal terbaru
        usort($undangan, fn($a, $b) => strcmp($b['tanggal'], $a['tanggal']));

        $this->bansos_model->update($bansos_id, [
            'undangan' => json_encode(array_values($undangan), JSON_UNESCAPED_UNICODE),
        ]);

        $this->session->set_flashdata('success', 'Undangan pengambilan berhasil dicatat.');
        redirect('bansos/riwayat/'.$warga_id);
    }

    // ── EDIT UNDANGAN ─────────────────────────────────────────
    public function edit_undangan() {
        if (!$this->_is_admin()) show_error('Akses ditolak.', 403);

        $bansos_id  = (int)$this->input->post('bansos_id');
        $und_index  = (int)$this->input->post('und_index');
        $warga_id   = (int)$this->input->post('warga_id');
        $tanggal    = $this->input->post('tanggal');
        $kehadiran  = $this->input->post('kehadiran') ?: 'menunggu';
        $keterangan = $this->input->post('keterangan', true);

        $item = $this->bansos_model->get_by_id_with_warga($bansos_id);
        if (!$item) show_404();

        // Pastikan bansos ini milik warga yang benar
        if ((int)$item->warga_id !== $warga_id) {
            $this->session->set_flashdata('error', 'Data tidak valid.');
            return redirect('bansos/riwayat/'.$warga_id);
        }

        $undangan = json_decode($item->undangan ?? '[]', true) ?: [];

        if (!isset($undangan[$und_index])) {
            $this->session->set_flashdata('error', 'Data undangan tidak ditemukan.');
            return redirect('bansos/riwayat/'.$warga_id);
        }

        // Update entry yang dipilih, pertahankan metadata lama
        $undangan[$und_index] = array_merge($undangan[$und_index], [
            'tanggal'    => $tanggal,
            'kehadiran'  => $kehadiran,
            'keterangan' => $keterangan,
            'diedit_at'  => date('Y-m-d H:i:s'),
            'diedit_oleh'=> (int)$this->session->userdata('user_id'),
        ]);

        // Re-sort setelah edit
        usort($undangan, fn($a, $b) => strcmp($b['tanggal'], $a['tanggal']));

        $this->bansos_model->update($bansos_id, [
            'undangan' => json_encode(array_values($undangan), JSON_UNESCAPED_UNICODE),
        ]);

        $this->session->set_flashdata('success', 'Catatan undangan berhasil diperbarui.');
        redirect('bansos/riwayat/'.$warga_id);
    }

    // ── HAPUS UNDANGAN ────────────────────────────────────────
    public function hapus_undangan() {
        if (!$this->_is_admin()) show_error('Akses ditolak.', 403);

        $bansos_id = (int)$this->input->post('bansos_id');
        $und_index = (int)$this->input->post('und_index');
        $warga_id  = (int)$this->input->post('warga_id');

        $item = $this->bansos_model->get_by_id_with_warga($bansos_id);
        if (!$item) show_404();

        // Pastikan bansos ini milik warga yang benar
        if ((int)$item->warga_id !== $warga_id) {
            $this->session->set_flashdata('error', 'Data tidak valid.');
            return redirect('bansos/riwayat/'.$warga_id);
        }

        $undangan = json_decode($item->undangan ?? '[]', true) ?: [];

        if (isset($undangan[$und_index])) {
            array_splice($undangan, $und_index, 1);
            $this->bansos_model->update($bansos_id, [
                'undangan' => json_encode(array_values($undangan), JSON_UNESCAPED_UNICODE),
            ]);
        }

        $this->session->set_flashdata('success', 'Catatan undangan berhasil dihapus.');
        redirect('bansos/riwayat/'.$warga_id);
    }

    // ── AJAX: CARI WARGA ──────────────────────────────────────
    public function cari_warga() {
        while (ob_get_level()) ob_end_clean();

        if (!$this->_is_admin()) {
            header('Content-Type: application/json; charset=utf-8');
            echo json_encode([]);
            exit;
        }

        $q = trim($this->input->get('q', true));

        if (mb_strlen($q) < 2) {
            header('Content-Type: application/json; charset=utf-8');
            echo json_encode([]);
            exit;
        }

        $results = $this->db
            ->select('w.id, w.nama_lengkap, w.nik, kk.no_kk')
            ->from('warga w')
            ->join('kartu_keluarga kk', 'kk.id = w.kk_id', 'left')
            ->group_start()
                ->like('w.nama_lengkap', $q)
                ->or_like('w.nik', $q)
            ->group_end()
            ->order_by('w.nama_lengkap', 'ASC')
            ->limit(10)
            ->get()
            ->result();

        header('Content-Type: application/json; charset=utf-8');
        echo json_encode($results, JSON_UNESCAPED_UNICODE);
        exit;
    }
}