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

class ControllerExportData extends CI_Controller
{

    public function __construct()
    {
        parent::__construct();
        //validasi jika user belum login
        check_not_login();
        if ($this->session->userdata('level') != 1) {
            redirect();
        }
        $this->set_timezone();
        $this->load->library('encrypt');
        $this->load->library('form_validation');
        $this->load->library('Mycustom');
        $this->load->library('pdfgenerator');
        $this->load->library('Notifikasi');
        $this->load->model('bagian_owner/insert_model');
        $this->load->model('bagian_owner/select_model');
        $this->load->model('bagian_owner/update_model');
    }
    public function set_timezone()
    {
        date_default_timezone_set("Asia/Jakarta");
    }
    public function index()
    {
        $notif                 = $this->notifikasi->notif_owner();
        // Data Login
        $data_login            = $this->userlogin->user_login(); // Menampilkan siapa yang login
        $data_id_login         = $this->session->userdata('isloggedin'); // Menampilkan data session
        // Data Isian Konten
        // Query SQL Data atau isi data page
        // Menampilkan saldo pertama koperasi 
        $data_table = $this->db->get_where('sistem_wa')->result();
        $jml_data   = count($data_table);
        $data = array(
            // Untuk memanggil halaman sesuai menu
            'folder'              => 'database/sistem/export',
            'page'                => 'index',
            'judul'               => 'Kelola Database Bagian Export Data || Bagian Pengurus',
            'data_id_login'       => $data_id_login,
            'data_login'          => $data_login,
            'notif'               => $notif,
            // Isi data
            'jml_data'            => $jml_data,
            'data_table'          => $data_table
        );
        $this->load->view('owner/index', $data);
    }
    public function crud()
    {
        if (isset($_POST['kirim_koperasi'])) :
            $this->_cekKoperasiData();
            $this->_notaKoperasiData();
            $this->session->set_flashdata('pesan_berhasil', 'Berhasil Export Data!');
            redirect('owner/database/sistem/export_data');
        endif;
    }
    // Private Funtion
    private function _cekKoperasiData()
    {
        $post = $this->input->post();

        $alias_map = [
            'anggota' => 'A',
            'p_koperasi_kontrak' => 'B',
            'p_koperasi_agungan' => 'C',
            'p_koperasi_progres' => 'D',
            'p_koperasi_angsuran' => 'E',
        ];

        // Pastikan join_rules sesuai struktur tabel, ganti anggota_id jika perlu
        $join_rules = [
            'p_koperasi_kontrak' => ['anggota', 'B.anggota_id = A.id'],
            'p_koperasi_agungan' => ['p_koperasi_kontrak', 'C.kontrak_id = B.id'],
            'p_koperasi_progres' => ['p_koperasi_kontrak', 'D.kontrak_id = B.id'],
            'p_koperasi_angsuran' => ['p_koperasi_kontrak', 'E.kontrak_id = B.id'],
        ];

        $selected_tables = [];
        foreach ($alias_map as $key => $alias) {
            if (isset($post[$key])) {
                $selected_tables[$key] = $alias;
            }
        }

        if (empty($selected_tables)) {
            $this->session->set_flashdata('pesan_gagal', 'Tidak ada data yang dipilih.');
            redirect('owner/database/sistem/export_data');
            return;
        }

        $this->db->reset_query();

        $is_progres_selected = isset($selected_tables['p_koperasi_progres']);

        if ($is_progres_selected) {
            $this->db->from("p_koperasi_progres D");
        } else {
            if (!isset($selected_tables['anggota'])) {
                $this->session->set_flashdata('pesan_gagal', 'Tabel utama (anggota) harus dipilih jika progres tidak dicentang.');
                redirect('owner/database/sistem/export_data');
                return;
            }
            $this->db->from("anggota A");
        }

        // Select semua kolom yang dipilih
        foreach ($selected_tables as $table => $alias) {
            $this->db->select("$alias.*");
        }

        // JOIN dengan urutan yang benar saat progres dipilih
        if ($is_progres_selected) {
            // JOIN p_koperasi_kontrak dulu
            if (isset($selected_tables['p_koperasi_kontrak'])) {
                $this->db->join("p_koperasi_kontrak B", "D.kontrak_id = B.id", "left");
            }
            // JOIN anggota setelahnya
            if (isset($selected_tables['anggota'])) {
                $this->db->join("anggota A", "B.anggota_id = A.id", "left");
            }
            // Join tabel lainnya berdasarkan join_rules dan tabel terpilih
            foreach ($selected_tables as $table => $alias) {
                if (in_array($table, ['p_koperasi_progres', 'p_koperasi_kontrak', 'anggota'])) continue;
                if (isset($join_rules[$table])) {
                    list($depends_on, $condition) = $join_rules[$table];
                    if (isset($selected_tables[$depends_on])) {
                        $this->db->join("$table $alias", $condition, "left");
                    }
                }
            }
        } else {
            // Jika progres tidak dipilih, join sesuai join_rules dari anggota (A)
            foreach ($selected_tables as $table => $alias) {
                if ($alias == 'A') continue; // already from anggota A
                if (isset($join_rules[$table])) {
                    list($depends_on, $condition) = $join_rules[$table];
                    if (isset($selected_tables[$depends_on])) {
                        $this->db->join("$table $alias", $condition, "left");
                    }
                }
            }
        }

        // Filter tanggal jika progres dipilih
        if ($is_progres_selected && !empty($post['tanggal_awal']) && !empty($post['tanggal_akhir'])) {
            $awal = $post['tanggal_awal'];
            $akhir = $post['tanggal_akhir'];
            $this->db->group_start();
            $this->db->where("D.tgl_pengajuan >=", $awal);
            $this->db->where("D.tgl_pengajuan <=", $akhir);
            $this->db->or_group_start();
            $this->db->where("D.tgl_realisasi >=", $awal);
            $this->db->where("D.tgl_realisasi <=", $akhir);
            $this->db->group_end();
            $this->db->group_end();
        }

        // Group by
        if ($is_progres_selected) {
            $this->db->group_by("D.kontrak_id");
        } elseif (isset($selected_tables['p_koperasi_kontrak'])) {
            $this->db->group_by("B.id");
        }

        $query = $this->db->get();
        $result = $query->result_array();

        if (!empty($result)) {
            $filename = 'export_koperasi_' . date('Ymd_His') . '.csv';
            header("Content-Description: File Transfer");
            header("Content-Disposition: attachment; filename=$filename");
            header("Content-Type: application/csv;");

            $file = fopen('php://output', 'w');
            fputcsv($file, array_keys($result[0]));

            foreach ($result as $row) {
                fputcsv($file, $row);
            }

            fclose($file);
            exit;
        } else {
            $this->session->set_flashdata('pesan_gagal', 'Data tidak ditemukan untuk diexport.');
            redirect('owner/database/sistem/export_data');
        }
    }
    private function _notaKoperasiData()
    {
        $post = $this->input->post();

        // Cek apakah checkbox "nota" dipilih
        if (empty($post['nota'])) {
            $this->session->set_flashdata('pesan_gagal', 'Checkbox Nota wajib dipilih.');
            redirect('owner/database/sistem/export_data');
            return;
        }

        $this->db->reset_query();
        $this->db->from("nota");

        // SELECT kolom dari nota dan tabel terkait
        $this->db->select("nota.*");
        $this->db->join("sistem_produk_koperasi", "sistem_produk_koperasi.id = nota.produk_id", "left");
        $this->db->select("sistem_produk_koperasi.nm_produk");

        // JOIN sistem_login dan sistem_identitas untuk petugas
        if (!empty($post['petugas_id'])) {
            $this->db->join("sistem_login petugas", "petugas.id = nota.petugas_id", "left");
            $this->db->join("sistem_identitas identitas_petugas", "identitas_petugas.login_id = petugas.id", "left");
            $this->db->select("identitas_petugas.nama AS nama_petugas");
        }

        // JOIN sistem_login dan sistem_identitas untuk kasir
        if (!empty($post['kasir_id'])) {
            $this->db->join("sistem_login kasir", "kasir.id = nota.kasir_id", "left");
            $this->db->join("sistem_identitas identitas_kasir", "identitas_kasir.login_id = kasir.id", "left");
            $this->db->select("identitas_kasir.nama AS nama_kasir");
        }

        // JOIN anggota
        if (!empty($post['anggota_id'])) {
            $this->db->join("anggota", "anggota.id = nota.anggota_id", "left");
            $this->db->select("anggota.nama AS nama_anggota");
        }

        // JOIN p_koperasi_nota dan p_koperasi_angsuran
        if (!empty($post['p_koperasi_nota'])) {
            $this->db->join("p_koperasi_nota", "p_koperasi_nota.nota_id = nota.id", "left");
            $this->db->select("p_koperasi_nota.*");

            if (!empty($post['nota_p_koperasi_angsuran'])) {
                $this->db->join("p_koperasi_angsuran", "p_koperasi_angsuran.id = p_koperasi_nota.angsuran_id", "left");
                $this->db->select("p_koperasi_angsuran.*");
            }
        }

        // Filter produk_id harus diawali dengan "12"
        $this->db->like('nota.produk_id', '12', 'after');

        // Filter tanggal jika diisi
        if (!empty($post['tanggal_awal']) && !empty($post['tanggal_akhir'])) {
            $awal = $post['tanggal_awal'];
            $akhir = $post['tanggal_akhir'];
            $this->db->where('nota.tgl_pembayaran >=', $awal);
            $this->db->where('nota.tgl_pembayaran <=', $akhir);
        }

        // Eksekusi query
        $query = $this->db->get();
        $result = $query->result_array();

        // Export ke CSV
        if (!empty($result)) {
            $filename = 'export_nota_' . date('Ymd_His') . '.csv';
            header("Content-Description: File Transfer");
            header("Content-Disposition: attachment; filename=$filename");
            header("Content-Type: application/csv;");

            $file = fopen('php://output', 'w');
            fputcsv($file, array_keys($result[0]));

            foreach ($result as $row) {
                fputcsv($file, $row);
            }

            fclose($file);
            exit;
        } else {
            $this->session->set_flashdata('pesan_gagal', 'Data tidak ditemukan untuk diexport.');
            redirect('owner/database/sistem/export_data');
        }
    }
}

/* End of file ControllerExportData.php and path \application\controllers\owner\database\sistem\ControllerExportData.php */