<?php
class Order extends CI_Controller{
    
    function __construct(){
		parent::__construct();
		
		// Cek Login
		if($this->session->userdata('masuk') != TRUE){
            if ($this->input->is_ajax_request()) {
                error_reporting(0); 
                ini_set('display_errors', 0);
                if (ob_get_length()) ob_clean();

                header('HTTP/1.1 401 Unauthorized');
                header('Content-Type: application/json');
                echo json_encode(array("status" => "logout", "message" => "Session Expired"));
                exit;
            } else {
                $url=base_url('administrator');
                redirect($url);
            }
        };

		$this->load->model('m_order');
		$this->load->model('m_status');
		$this->load->model('m_pengguna');
		$this->load->library('pagination');
	}

    function index(){
        $kode = $this->session->userdata('idadmin');
        $x['user'] = $this->m_pengguna->get_pengguna_login($kode);
        $x['data'] = $this->m_order->get_all_order();
        $x['stts'] = $this->m_status->get_all_status();
        
        $x['cabang_list'] = $this->m_order->get_list_cabang();
        
        if(!empty($x['cabang_list']) && is_array($x['cabang_list'])){
            $first = reset($x['cabang_list']); 
            $x['default_cabang'] = isset($first->kdcabang) ? $first->kdcabang : '';
        } else {
            $x['default_cabang'] = '';
        }
        
        $this->load->view('admin/v_order',$x);
    }
    
    function load_data_penjualan() {
        error_reporting(0);
        ini_set('display_errors', 0);
    
        if (!$this->input->is_ajax_request()) {
            exit('No direct script access allowed');
        }
    
        $kdcabang  = $this->input->post('kdcabang');
        $search    = $this->input->post('search');
        $tgl_awal  = $this->input->post('tgl_awal');
        $tgl_akhir = $this->input->post('tgl_akhir');
        $status    = $this->input->post('status');   
        $order_by  = $this->input->post('order_by');
        
        $page_val  = $this->input->post('page');
        $offset    = (int)$page_val; 
        $limit     = 50;
    
        $data = $this->m_order->get_penjualan_filtered($limit, $offset, $kdcabang, $search, $tgl_awal, $tgl_akhir, $order_by, $status);
        
        $total_rows = $this->m_order->count_penjualan_filtered($kdcabang, $search, $tgl_awal, $tgl_akhir, $status);
        $csrf_token = $this->security->get_csrf_hash();
    
        if (ob_get_length()) ob_clean();
    
        header('Content-Type: application/json');
    
        $out = '{';
        $out .= '"total_rows": ' . $total_rows . ',';
        $out .= '"per_page": ' . $limit . ',';
        $out .= '"offset": ' . $offset . ',';
        $out .= '"csrf_token": "' . $csrf_token . '",';
        $out .= '"table_data": [';
    
        $rows_str = array();
        if(!empty($data)) {
            foreach($data as $row) {
                $faktur = isset($row->no_faktur_penjualan) ? str_replace('"', '\\"', $row->no_faktur_penjualan) : '';
                $tgl    = isset($row->tgl_penjualan) ? $row->tgl_penjualan : '';
                $waktu  = isset($row->waktu) ? $row->waktu : '';
                $kd     = isset($row->kdcabang) ? str_replace('"', '\\"', $row->kdcabang) : '';
                $pel_raw = isset($row->npelanggan) ? $row->npelanggan : '-';
                $pel     = str_replace(array('"', "\r", "\n"), array('\\"', ' ', ' '), $pel_raw);
                $ket_raw = isset($row->keter) ? $row->keter : '-';
                $ket     = str_replace(array('"', "\r", "\n"), array('\\"', ' ', ' '), $ket_raw);
                $selesai = isset($row->selesai) ? $row->selesai : '0'; 
                $val_netto = isset($row->netto) ? $row->netto : 0;
    
                $item_str  = '{';
                $item_str .= '"no_faktur_penjualan":"' . $faktur . '",';
                $item_str .= '"tgl_penjualan":"' . $tgl . '",';
                $item_str .= '"waktu":"' . $waktu . '",';
                $item_str .= '"kdcabang":"' . $kd . '",';
                $item_str .= '"npelanggan":"' . $pel . '",';
                $item_str .= '"keter":"' . $ket . '",';
                $item_str .= '"selesai":"' . $selesai . '",'; 
                $item_str .= '"netto_val":"' . $val_netto . '"'; 
                $item_str .= '}';
                
                $rows_str[] = $item_str;
            }
        }
    
        $out .= implode(',', $rows_str);
        $out .= ']}';
    
        echo $out;
        exit;
    }
    
    // function get_detail_items() {
    //     // Matikan error reporting khusus untuk fungsi ini juga
    //     error_reporting(0);
    //     if (ob_get_length()) ob_clean();

    //     $kode = $this->input->post('kode');
    //     $data = $this->m_order->getProdukDijual($kode)->result();
        
    //     header('Content-Type: application/json');
    //     echo json_encode($data);
    //     exit;
    // }
    
    function get_detail_items() {
        error_reporting(0);
        ini_set('display_errors', 0);
        if (ob_get_length()) ob_clean();
    
        $kode = $this->input->post('kode');
        $q_header = $this->m_order->getPenjualanSelesai($kode);
        $header   = $q_header->row();
        $items    = $this->m_order->getProdukDijual($kode)->result();
        $nm_toko = '-';
        if(isset($header->kdcabang)){
            $q_toko = $this->db->select('nm_toko')->get_where('tabel_toko', array('kdcabang' => $header->kdcabang));
            if($q_toko->num_rows() > 0){
                $nm_toko = $q_toko->row()->nm_toko;
            } else {
                $nm_toko = $header->kdcabang; 
            }
        }
    
        header('Content-Type: application/json');
        
        // Layanan
        $layanan_str = 'DINE IN';
        if(isset($header->layanan)){
            if($header->layanan == '2') $layanan_str = 'TAKE AWAY';
            elseif($header->layanan == '3') $layanan_str = 'DELIVERY ORDER';
        }
    
        // Jenis Bayar
        $bayar_str = 'DIGITAL PAYMENT';
        if(isset($header->jnsbayar)){
            if($header->jnsbayar == '1') $bayar_str = 'CASH';
            elseif($header->jnsbayar == '2') $bayar_str = 'DEBET';
        }
        
        $json = '{';
        
        $npelanggan = isset($header->npelanggan) ? str_replace(array('"', "\\", "\r", "\n", "\t"), array('\\"', '\\\\', ' ', ' ', ' '), $header->npelanggan) : '-';
        // $kdcabang   = isset($header->kdcabang) ? $header->kdcabang : '-'; // Tidak dipakai, diganti nm_toko
        $tgl        = isset($header->tgl_penjualan) ? $header->tgl_penjualan : '';
        $waktu      = isset($header->waktu) ? $header->waktu : '';
        $keter      = isset($header->keter) ? str_replace(array('"', "\\", "\r", "\n", "\t"), array('\\"', '\\\\', ' ', ' ', ' '), $header->keter) : '-';
        
        $disc_percent = isset($header->disc) ? $header->disc : 0; 
        $disc_value   = isset($header->diskon) ? $header->diskon : 0;
        $ndisc        = isset($header->ndisc) ? $header->ndisc : 0;   
        $nppn       = isset($header->nppn) ? $header->nppn : 0;
        $nbayar     = isset($header->nbayar) ? $header->nbayar : 0;
        $nkembali   = isset($header->nkembali) ? $header->nkembali : 0;
        $selesai    = isset($header->selesai) ? $header->selesai : '0';
    
        $json .= '"header": {';
        $json .= '"npelanggan":"' . $npelanggan . '",';
        $json .= '"nm_toko":"' . str_replace(array('"', "\\"), array('\\"', '\\\\'), $nm_toko) . '",'; 
        $json .= '"tanggal":"' . $tgl . ' ' . $waktu . '",';
        $json .= '"keter":"' . $keter . '",';
        $json .= '"layanan":"' . $layanan_str . '",';
        $json .= '"jnsbayar":"' . $bayar_str . '",';
        $json .= '"disc_percent":"' . $disc_percent . '",'; 
        $json .= '"disc_value":"' . $disc_value . '",';    
        $json .= '"ndisc":"' . $ndisc . '",';
        
        // Data Baru
        $json .= '"nppn":"' . $nppn . '",';
        $json .= '"nbayar":"' . $nbayar . '",';
        $json .= '"nkembali":"' . $nkembali . '",';
        $json .= '"selesai":"' . $selesai . '"';
        $json .= '},';
        
        $json .= '"items": [';
        $items_str = array();
        if(!empty($items)) {
            foreach($items as $row) {
                $nm_barang = isset($row->nm_barang) ? str_replace(array('"', "\\", "\r", "\n", "\t"), array('\\"', '\\\\', ' ', ' ', ' '), $row->nm_barang) : '';
                $note      = isset($row->note) ? str_replace(array('"', "\\", "\r", "\n", "\t"), array('\\"', '\\\\', ' ', ' ', ' '), $row->note) : '';
                $jumlah    = isset($row->jumlah) ? $row->jumlah : 0;
                $harga     = isset($row->harga) ? $row->harga : 0;
                $disc_item = isset($row->diskonpersen) ? $row->diskonpersen : 0;
                $subtotal  = isset($row->sub_total_jual) ? $row->sub_total_jual : 0;
    
                $str  = '{';
                $str .= '"nm_barang":"' . $nm_barang . '",';
                $str .= '"note":"' . $note . '",';
                $str .= '"jumlah":"' . $jumlah . '",';
                $str .= '"harga":"' . $harga . '",';
                $str .= '"diskonpersen":"' . $disc_item . '",';
                $str .= '"sub_total_jual":"' . $subtotal . '"';
                $str .= '}';
                
                $items_str[] = $str;
            }
        }
        
        $json .= implode(',', $items_str);
        $json .= ']'; 
        $json .= '}'; 
        
        echo $json;
        exit;
    }
    
    
    function update_order(){
        $kode   = $this->input->post('kode');
        $status = str_replace("'", "", $this->input->post('status'));
        $this->m_order->update_order($kode,$status);
        echo $this->session->set_flashdata('msg','<div class="alert alert-success"><button type="button" class="close" data-dismiss="alert">&times;</button>Status order untuk No Invoice: <b>'.$kode.'</b> Berhasil diupdate.</div>');
        redirect('admin/order');
    }

    function hapus_order(){
        $kode = $this->input->post('kode');
        $this->m_order->hapus_order($kode);
        echo $this->session->set_flashdata('msg','<div class="alert alert-success"><button type="button" class="close" data-dismiss="alert">&times;</button>Order untuk invoice: <b>'.$kode.'</b> Berhasil dihapus.</div>');
        redirect('admin/order');
    }
    
    // Fungsi Central untuk Handle Export & Print
    function process_export_print() {
        if($this->session->userdata('masuk') != TRUE){
            redirect('administrator');
        }

        ini_set('memory_limit', '512M');
        set_time_limit(300);

        $action_type = $this->input->post('action_type'); 
        $mode        = $this->input->post('mode'); 
        
        $this->db->select('tabel_penjualan.*, tabel_toko.nm_toko');
        $this->db->from('tabel_penjualan');
        $this->db->join('tabel_toko', 'tabel_penjualan.kdcabang = tabel_toko.kdcabang', 'left');

        if ($mode == 'selected_ids') {
            $ids_array = $this->input->post('ids');
            if (!empty($ids_array) && is_array($ids_array)) {
                $this->db->where_in('no_faktur_penjualan', $ids_array);
            } else {
                $this->db->where('1=0'); 
            }
        } else if ($mode == 'date_range') {
            $period = $this->input->post('period_select');
            
            // Default Hari Ini
            $start_date = date('Y-m-d'); 
            $end_date   = date('Y-m-d');

            if ($period == 'yesterday') {
                $start_date = date('Y-m-d', strtotime("-1 days"));
                $end_date   = date('Y-m-d', strtotime("-1 days"));
                
            } else if ($period == 'this_month') {
                $start_date = date('Y-m-01'); 
                $end_date   = date('Y-m-t');  
                
            } else if ($period == 'custom') {
                $range = $this->input->post('custom_date_range');
                $dates = explode(' - ', $range);
                if(count($dates) == 2) {
                    $start_date = trim($dates[0]);
                    $end_date   = trim($dates[1]);
                }
            }
            
            $this->db->where('tgl_penjualan >=', $start_date);
            $this->db->where('tgl_penjualan <=', $end_date);
        }

        $this->db->order_by('tgl_penjualan', 'DESC');

        // Eksekusi
        if ($action_type == 'export') {
            $query = $this->db->get(); 
            $this->_generate_csv($query);
        } else {
            $data = $this->db->get()->result();
            $this->_generate_print_view($data);
        }
    }

    private function _generate_csv($query) {
        $filename = 'export_orders_' . date('Ymd_His') . '.csv';
        
        header("Content-Description: File Transfer"); 
        header("Content-Disposition: attachment; filename=$filename"); 
        header("Content-Type: application/csv");
        header("Pragma: no-cache"); 
        header("Expires: 0");
        
        $file = fopen('php://output', 'w');
        
        // Tulis Header CSV
        $header = array("No Faktur", "Tanggal", "Waktu", "Cabang", "Pelanggan", "Status Bayar", "Layanan", "Total", "Keterangan"); 
        fputcsv($file, $header);
        
        while ($row = $query->unbuffered_row('object')) {
            $layanan = ($row->layanan == 1) ? 'Dine In' : (($row->layanan == 2) ? 'Take Away' : 'Delivery');
            $bayar   = ($row->jnsbayar == 1) ? 'Cash' : 'Debet/QRIS';
            $nm_toko = $row->nm_toko ? $row->nm_toko : $row->kdcabang;
            
            $line = array(
                $row->no_faktur_penjualan,
                $row->tgl_penjualan,
                $row->waktu,
                $nm_toko,
                $row->npelanggan,
                $bayar,
                $layanan,
                $row->total_penjualan_sdiskon,
                $row->keter
            );
            fputcsv($file, $line); 
        }
        
        fclose($file); 
        exit; 
    }

    private function _generate_print_view($data) {
        echo '<html><head><title>Print Report</title>';
        echo '<style>
                body{font-family:Arial, sans-serif; font-size:12px;} 
                table{width:100%; border-collapse:collapse; margin-top:20px;} 
                th, td{border:1px solid #ddd; padding:8px; text-align:left;} 
                th{background-color:#f2f2f2;}
                h2{text-align:center;}
                .text-right{text-align:right;}
              </style>';
        echo '</head><body onload="window.print()">';
        
        echo '<h2>Laporan Penjualan</h2>';
        echo '<p>Dicetak pada: '.date('d-m-Y H:i:s').'</p>';
        
        echo '<table>';
        echo '<thead><tr>
                <th>No Faktur</th>
                <th>Waktu</th>
                <th>Cabang</th>
                <th>Pelanggan</th>
                <th>Layanan</th>
                <th>Ket</th>
                <th class="text-right">Total</th>
              </tr></thead><tbody>';
              
        $grand_total = 0;
        if(!empty($data)){
            foreach($data as $row){
                $nm_toko = isset($row->nm_toko) ? $row->nm_toko : $row->kdcabang;
                $layanan = ($row->layanan == 1) ? 'Dine In' : (($row->layanan == 2) ? 'Take Away' : 'Delivery');
                $total   = $row->total_penjualan_sdiskon;
                $grand_total += $total;
                
                echo '<tr>';
                echo '<td>'.$row->no_faktur_penjualan.'</td>';
                echo '<td>'.$row->tgl_penjualan.' '.$row->waktu.'</td>';
                echo '<td>'.$nm_toko.'</td>';
                echo '<td>'.$row->npelanggan.'</td>';
                echo '<td>'.$layanan.'</td>';
                echo '<td>'.$row->keter.'</td>';
                echo '<td class="text-right">Rp '.number_format($total,0,',','.').'</td>';
                echo '</tr>';
            }
            echo '<tr>
                    <td colspan="6" class="text-right" style="font-weight:bold;">GRAND TOTAL</td>
                    <td class="text-right" style="font-weight:bold;">Rp '.number_format($grand_total,0,',','.').'</td>
                  </tr>';
        } else {
            echo '<tr><td colspan="7" style="text-align:center;">Tidak ada data</td></tr>';
        }
        
        echo '</tbody></table>';
        echo '</body></html>';
    }
    
    
    function ajax_void_order() {
        if($this->session->userdata('masuk') != TRUE){
            echo json_encode(['status' => false, 'message' => 'Sesi habis']);
            exit;
        }
    
        $kode = $this->input->post('kode');
        
        if($kode) {
            $update = $this->m_order->update_status_batal($kode);
            
            if($update) {
                echo json_encode(['status' => true, 'message' => 'Status berhasil diubah menjadi Batal.']);
            } else {
                echo json_encode(['status' => false, 'message' => 'Gagal mengupdate database.']);
            }
        } else {
            echo json_encode(['status' => false, 'message' => 'Kode faktur tidak valid.']);
        }
    }

}