<?php

namespace App\Controllers;

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

use App\Models\ModelPerizinan;
use App\Models\ModelUser;

class Perizinan extends BaseController
{
    protected $modelPerizinan;
    protected $modelUser;

    public function __construct()
    {
        // Cek apakah pengguna sudah login
        if (!session()->get('isLoggedIn')) {
            return redirect()->to('/login'); // Arahkan ke halaman login jika belum login
        }
        $this->modelPerizinan = new ModelPerizinan();
        $this->modelUser = new ModelUser();

        // untuk helper format rupiah
        helper('currency_helper');
    }

    public function index()
    {
        $dataPerizinan = $this->modelPerizinan->getAllIzin();
        $dataUser = $this->modelUser->getAllDataUser();
        $dataBreadcumb = 'Perizinan';

        $data = [
            'Breadcumb' => $dataBreadcumb,
            'user' => $dataUser,
            'perizinan' => $dataPerizinan,
        ];

        return view('perizinan/index', $data);
    }

    public function getData($id_izin)
    {
        if ($this->request->isAJAX()) {
            $data = $this->modelPerizinan->find($id_izin); // Ambil data berdasarkan ID

            if ($data) {
                echo json_encode($data); // Kirim data ke frontend
            } else {
                echo json_encode(null);
            }
        }
    }

    public function tambahData()
    {
        if ($this->request->isAJAX()) {

            $id_user              = $this->request->getVar('id_user');
            $tanggal_awal_izin    = $this->request->getVar('tanggal_awal_izin');
            $tanggal_akhir_izin   = $this->request->getVar('tanggal_akhir_izin');
            $jam_mulai            = $this->request->getVar('jam_mulai');
            $jam_kembali          = $this->request->getVar('jam_kembali');
            $jenis_izin           = $this->request->getVar('jenis_izin');
            $keterangan           = $this->request->getVar('keterangan');
            $status               = $this->request->getVar('status');
            $atasan_langsung      = $this->request->getVar('atasan_langsung');

            // Validasi data
            $errors = [];

            if (empty($id_user)) $errors[] = 'Nama Petugas';
            if (empty($tanggal_awal_izin)) $errors[] = 'Tanggal Awal Izin';
            if (empty($tanggal_akhir_izin)) $errors[] = 'Tanggal Akhir Izin';
            if (empty($jam_mulai)) $errors[] = 'Jam Mulai';
            if (empty($jam_kembali)) $errors[] = 'Jam Kembali';
            if (empty($jenis_izin)) $errors[] = 'Jenis Izin';
            if (empty($keterangan)) $errors[] = 'Keterangan';
            if (empty($status)) $errors[] = 'Status';
            if (empty($atasan_langsung)) $errors[] = 'Atasan Langsung';

            if (!empty($errors)) {
                $msg = [
                    'status' => 'error',
                    'message' => 'Field berikut harus diisi: ' . implode(', ', $errors)
                ];
                echo json_encode($msg);
                return;
            }

            // Generate kode otomatis
            $kodeIzin = 'IZN-' . strtoupper(uniqid());

            // Data untuk insert
            $data = [
                'kode_izin'                => $kodeIzin,
                'id_user'             => $id_user,
                'tanggal_awal_izin'   => $tanggal_awal_izin,
                'tanggal_akhir_izin'  => $tanggal_akhir_izin,
                'jam_mulai'           => $jam_mulai,
                'jam_kembali'         => $jam_kembali,
                'jenis_izin'          => $jenis_izin,
                'keterangan'          => $keterangan,
                'status'              => $status,
                'atasan_langsung'     => $atasan_langsung,
                // 'created_at'          => date('Y-m-d H:i:s'),
                // 'updated_at'          => date('Y-m-d H:i:s')
            ];


            // Memanggil method tambahData() dari model untuk insert data
            if ($this->modelPerizinan->tambahData($data)) {
                $msg = ['status' => 'success', 'message' => 'Data Perizinan berhasil ditambahkan'];
                echo json_encode($msg);
            } else {
                $msg = ['status' => 'error', 'message' => 'Terjadi kesalahan saat menambahkan data'];
                echo json_encode($msg);
            }
        }
    }

    public function updateData()
    {
        if ($this->request->isAJAX()) {
            $id_izin                = $this->request->getVar('id_izin');
            $id_user              = $this->request->getVar('id_user');
            $tanggal_awal_izin    = $this->request->getVar('tanggal_awal_izin');
            $tanggal_akhir_izin   = $this->request->getVar('tanggal_akhir_izin');
            $jam_mulai            = $this->request->getVar('jam_mulai');
            $jam_kembali          = $this->request->getVar('jam_kembali');
            $jenis_izin           = $this->request->getVar('jenis_izin');
            $keterangan           = $this->request->getVar('keterangan');
            $status               = $this->request->getVar('status');
            $atasan_langsung      = $this->request->getVar('atasan_langsung');

            // Validasi data
            $errors = [];

            if (empty($id_user)) $errors[] = 'Nama Petugas';
            if (empty($tanggal_awal_izin)) $errors[] = 'Tanggal Awal Izin';
            if (empty($tanggal_akhir_izin)) $errors[] = 'Tanggal Akhir Izin';
            if (empty($jam_mulai)) $errors[] = 'Jam Mulai';
            if (empty($jam_kembali)) $errors[] = 'Jam Kembali';
            if (empty($jenis_izin)) $errors[] = 'Jenis Izin';
            if (empty($keterangan)) $errors[] = 'Keterangan';
            if (empty($status)) $errors[] = 'Status';
            if (empty($atasan_langsung)) $errors[] = 'Atasan Langsung';

            if (!empty($errors)) {
                $msg = [
                    'status' => 'error',
                    'message' => 'Field berikut harus diisi: ' . implode(', ', $errors)
                ];
                echo json_encode($msg);
                return;
            }



            // Data untuk insert
            $data = [
                'id_user'             => $id_user,
                'tanggal_awal_izin'   => $tanggal_awal_izin,
                'tanggal_akhir_izin'  => $tanggal_akhir_izin,
                'jam_mulai'           => $jam_mulai,
                'jam_kembali'         => $jam_kembali,
                'jenis_izin'          => $jenis_izin,
                'keterangan'          => $keterangan,
                'status'              => $status,
                'atasan_langsung'     => $atasan_langsung,
                // 'created_at'          => date('Y-m-d H:i:s'),
                // 'updated_at'          => date('Y-m-d H:i:s')
            ];


            // Memanggil method updateData() dari model untuk insert data
            if ($this->modelPerizinan->updateData($id_izin, $data)) {
                $msg = ['status' => 'success', 'message' => 'Data Perizinan berhasil di update'];
            } else {
                $msg = ['error' => 'Terjadi kesalahan saat menambahkan data'];
            }

            echo json_encode($msg);
        }
    }

    public function deleteData()
    {
        if ($this->request->isAJAX()) {
            // Ambil data dari request
            $id_izin = $this->request->getVar('id_izin');

            // Validasi apakah ID ada
            if (!$id_izin) {
                return $this->response->setJSON(['error' => 'Terjadi kesalahan saat Hapus data']);
            }

            // Inisialisasi model


            // Cari data berdasarkan ID
            $PerizinanData = $this->modelPerizinan->find($id_izin);
            if (!$PerizinanData) {
                return $this->response->setJSON(
                    [
                        'error' => "Data Perizinan dengan ID $id_izin tidak ditemukan"
                    ]
                );
            }

            // Ambil nama untuk pesan sukses
            $nama = $PerizinanData['kode_izin'] ?? 'Tidak Diketahui';

            // Proses penghapusan data
            if ($this->modelPerizinan->delete($id_izin)) {
                return $this->response->setJSON(['status' => 'success', 'message' => "Data Perizinan $nama  berhasil dihapus"]);
            } else {
                return $this->response->setJSON([
                    'error' => "Terjadi kesalahan saat menghapus data Perizinan"
                ]);
            }
        }

        // Jika bukan permintaan AJAX, tampilkan error
        return $this->response->setJSON([
            'error' => "Akses tidak valid"
        ]);
    }



    public function changeStatus()
    {
        $id_izin = $this->request->getPost('id_izin');
        $status = $this->request->getPost('status');


        if ($this->modelPerizinan->update($id_izin, ['status' => $status])) {
            return $this->response->setJSON([
                'status' => 'success',
                'message' => 'Status Perizinan berhasil diubah.'
            ]);
        } else {
            return $this->response->setJSON([
                'success' => false,
                'message' => 'Gagal mengubah status Produk.'
            ]);
        }
    }

    public function getPerizinanBySiswa($id_siswa)
    {
        $Perizinan = $this->modelPerizinan
            ->where('id_siswa', $id_siswa)
            ->where('is_active', 1)
            ->first();

        if ($Perizinan) {
            echo json_encode($Perizinan);
        } else {
            echo json_encode(null);
        }
    }

    public function importData()
    {
        $file = $this->request->getFile('fileImport');

        if ($file->isValid() && !$file->hasMoved()) {
            $ext = $file->getClientExtension();
            $validExtensions = ['xls', 'xlsx', 'csv'];

            if (in_array($ext, $validExtensions)) {
                $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader(ucfirst($ext));
                $spreadsheet = $reader->load($file->getTempName());
                $data = $spreadsheet->getActiveSheet()->toArray();

                // Validasi dan simpan data
                $PerizinanModel = new ModelPerizinan();
                $rows = [];
                $duplicates = [];
                $errors = [];

                foreach ($data as $index => $row) {
                    if ($index === 0) continue; // Lewati header

                    // Pengecekan duplikasi berdasarkan NIK
                    $existing = $PerizinanModel->where('nik', $row[1])->first();
                    if ($existing) {
                        $duplicates[] = $row[1]; // Simpan NIK yang duplikat
                        continue; // Skip data ini
                    }

                    $rows[] = [
                        'nama' => $row[0],
                        'nik' => $row[1],
                        'tanggal_lahir' => $row[2],
                        'jenis_kelamin' => $row[3],
                        'alamat' => $row[4],
                        'nama_ibu' => $row[5],
                        'nama_ayah' => $row[6],
                        'status_imunisasi' => $row[7],
                        'berat_badan' => $row[8],
                        'tinggi_badan' => $row[9],
                    ];
                }

                if (!empty($rows)) {
                    $PerizinanModel->insertBatch($rows);
                    $message = 'Data berhasil diimport.';
                }

                // Jika ada duplikasi, tambahkan pesan
                if (!empty($duplicates)) {
                    $message = 'Data dengan NIK berikut sudah ada: ' . implode(', ', $duplicates) . '. ';
                }

                // Jika tidak ada data untuk diimport
                if (empty($rows) && empty($duplicates)) {
                    $message = 'Tidak ada data yang diimport.';
                }

                // Mengembalikan response
                if ($message) {
                    return $this->response->setJSON(['status' => 'success', 'message' => $message]);
                }
            }

            return $this->response->setJSON(['status' => 'error', 'message' => 'Format file tidak valid.']);
        }

        return $this->response->setJSON(['status' => 'error', 'message' => 'File tidak valid.']);
    }
}
