<?php

namespace App\Controllers;

use App\Models\ModelPengajuanCuti;
use App\Models\ModelJenisCuti;
use App\Models\ModelUser;

class PengajuanCuti extends BaseController
{
    protected $modelPengajuanCuti;
    protected $modelJenisCuti;
    protected $modelUser;
    protected $modelService;

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

    public function index()
    {

        $session = session();
        $userRole = $session->get('role');
        $id_user = $session->get('id_user');

        // Ambil data cuti sesuai role
        if ($userRole === 'admin') {
            $dataPengajuanCuti = $this->modelPengajuanCuti->getAllData();
        } elseif ($userRole === 'user') {
            $dataPengajuanCuti = $this->modelPengajuanCuti->getByUser($id_user);
        } elseif ($userRole === 'supervisor') {
            $dataPengajuanCuti = $this->modelPengajuanCuti->getByRole('supervisor', $id_user);
        } elseif ($userRole === 'manager') {
            $dataPengajuanCuti = $this->modelPengajuanCuti->getByRole('manager', $id_user);
        } else {
            $dataPengajuanCuti = []; // default kosong
        }

        // $dataPengajuanCuti = $this->modelPengajuanCuti->getAllData();
        $dataJenisCuti = $this->modelJenisCuti->getAllData();
        $dataBreadcumb = 'Pengajuan Cuti';

        $data = [
            'Breadcumb' => $dataBreadcumb,
            'jeniscuti' => $dataJenisCuti,
            'pengajuancuti' => $dataPengajuanCuti,
        ];

        // Hanya admin butuh semua user
        if ($userRole === 'admin') {
            $data['user'] = $this->modelUser->getAllDataUser();
        }

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

    public function detail($id)
    {
        // Cari data pengajuan berdasarkan ID
        $pengajuan = $this->modelPengajuanCuti->select('
        pengajuancuti.*, 
        users.nama, 
        users.nip, 
        jenis_cuti.nama_jenis
    ')
            ->join('users', 'users.id_user = pengajuancuti.id_user', 'left')
            ->join('jenis_cuti', 'jenis_cuti.id_jenis = pengajuancuti.id_jenis', 'left')
            ->where('pengajuancuti.id', $id)
            ->first();

        if ($pengajuan) {
            return $this->response->setJSON($pengajuan);
        } else {
            return $this->response->setJSON([
                'status' => 'error',
                'message' => 'Data tidak ditemukan'
            ])->setStatusCode(404);
        }
    }

    public function cekStatusCuti($id)
    {
        $cuti = $this->modelPengajuanCuti
            ->select('status_supervisor, status_manager')
            ->where('id', $id)
            ->first();

        if (!$cuti) {
            return $this->response->setJSON([
                'status' => 'error',
                'message' => 'Data pengajuan tidak ditemukan.'
            ]);
        }

        if ($cuti['status_supervisor'] === 'disetujui' && $cuti['status_manager'] === 'disetujui') {
            return $this->response->setJSON([
                'status' => 'ok'
            ]);
        } else {
            return $this->response->setJSON([
                'status' => 'fail',
                'message' => 'Pengajuan Anda masih pending di Supervisor atau Manager.'
            ]);
        }
    }



    public function getData($id)
    {
        if ($this->request->isAJAX()) {
            $data = $this->modelPengajuanCuti->find($id); // 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->getPost('id_user');
            $id_jenis        = $this->request->getPost('id_jenis');
            $tanggal_mulai   = $this->request->getPost('tanggal_mulai');
            $tanggal_selesai = $this->request->getPost('tanggal_selesai');
            $keterangan      = $this->request->getPost('keterangan');
            $alamat_selama_menjalankan_cuti      = $this->request->getPost('alamat_selama_menjalankan_cuti');
            $golongan_ruang      = $this->request->getPost('golongan_ruang');
            $masa_kerja      = $this->request->getPost('masa_kerja');

            $file_berkas = $this->request->getFile('file_berkas');
            $nama_file = null;

            if ($file_berkas && $file_berkas->isValid() && !$file_berkas->hasMoved()) {
                $nama_file = $file_berkas->getRandomName(); // Nama unik
                $file_berkas->move('uploads/berkas_cuti', $nama_file); // Simpan ke folder
            }


            // Validasi input
            $errors = [];

            if (!$id_user || trim($id_user) === '') {
                $errors[] = 'Pemohon';
            }
            if (empty($id_jenis)) {
                $errors[] = 'Jenis Cuti';
            }
            if (empty($tanggal_mulai)) {
                $errors[] = 'Tanggal Mulai';
            }
            if (empty($tanggal_selesai)) {
                $errors[] = 'Tanggal Selesai';
            }

            if (!empty($errors)) {
                return $this->response->setJSON([
                    'status'  => 'error',
                    'message' => 'Field berikut harus diisi: ' . implode(', ', $errors)
                ]);
            }

            // Data siap disimpan
            $data = [
                'id_user'         => $id_user,
                'id_jenis'        => $id_jenis,
                'tanggal_mulai'   => $tanggal_mulai,
                'tanggal_selesai' => $tanggal_selesai,
                'keterangan'      => $keterangan,
                'alamat_selama_menjalankan_cuti'      => $alamat_selama_menjalankan_cuti,
                'golongan_ruang'      => $golongan_ruang,
                'masa_kerja'      => $masa_kerja,
                'file_berkas'            => $nama_file, // Tambahan
                'status_supervisor' => 'pending',
                'status_manager'    => 'pending',
                'status_admin'      => 'pending',
            ];
            // Memanggil method tambahData() dari model untuk insert data
            if ($this->modelPengajuanCuti->tambahData($data)) {
                $msg = ['status' => 'success', 'message' => 'Data PengajuanCuti 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                 = $this->request->getPost('id');
            $id_user         = $this->request->getPost('id_user');
            $id_jenis        = $this->request->getPost('id_jenis');
            $tanggal_mulai   = $this->request->getPost('tanggal_mulai');
            $tanggal_selesai = $this->request->getPost('tanggal_selesai');
            $keterangan      = $this->request->getPost('keterangan');
            $alamat_selama_menjalankan_cuti      = $this->request->getPost('alamat_selama_menjalankan_cuti');
            $golongan_ruang      = $this->request->getPost('golongan_ruang');
            $masa_kerja      = $this->request->getPost('masa_kerja');

            // Validasi input
            $errors = [];

            if (empty($id_user)) {
                $errors[] = 'Pemohon';
            }
            if (empty($id_jenis)) {
                $errors[] = 'Jenis Cuti';
            }
            if (empty($tanggal_mulai)) {
                $errors[] = 'Tanggal Mulai';
            }
            if (empty($tanggal_selesai)) {
                $errors[] = 'Tanggal Selesai';
            }

            if (!empty($errors)) {
                return $this->response->setJSON([
                    'status'  => 'error',
                    'message' => 'Field berikut harus diisi: ' . implode(', ', $errors)
                ]);
            }

            // Ambil data lama untuk cek apakah ada file
            $oldData = $this->modelPengajuanCuti->find($id);
            $oldFile = $oldData['file_berkas'] ?? null;

            // Proses upload file baru jika ada
            $file = $this->request->getFile('file_berkas');
            $newFileName = $oldFile; // Default: tetap pakai file lama

            if ($file && $file->isValid() && !$file->hasMoved()) {
                $ext = $file->getExtension();
                $newFileName = uniqid() . '.' . $ext;
                $uploadPath = FCPATH . 'uploads/berkas_cuti/';

                // Pindahkan file ke folder upload
                $file->move($uploadPath, $newFileName);

                // Hapus file lama jika ada
                if ($oldFile && file_exists($uploadPath . $oldFile)) {
                    unlink($uploadPath . $oldFile);
                }
            }

            // Data siap disimpan
            $data = [
                'id_user'         => $id_user,
                'id_jenis'        => $id_jenis,
                'tanggal_mulai'   => $tanggal_mulai,
                'tanggal_selesai' => $tanggal_selesai,
                'keterangan'      => $keterangan,
                'alamat_selama_menjalankan_cuti'      => $alamat_selama_menjalankan_cuti,
                'golongan_ruang'      => $golongan_ruang,
                'masa_kerja'      => $masa_kerja,
                'file_berkas'      => $newFileName,
                'status_supervisor' => 'pending',
                'status_manager'    => 'pending',
                'status_admin'      => 'pending',
            ];

            // Memanggil method updateData() dari model untuk insert data
            if ($this->modelPengajuanCuti->updateData($id, $data)) {
                $msg = ['status' => 'success', 'message' => 'Data PengajuanCuti 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 = $this->request->getVar('id');

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

            // Inisialisasi model


            // Cari data berdasarkan ID
            $PengajuanCutiData = $this->modelPengajuanCuti->find($id);
            if (!$PengajuanCutiData) {
                return $this->response->setJSON(
                    [
                        'error' => "Data PengajuanCuti dengan ID $id tidak ditemukan"
                    ]
                );
            }

            // Ambil nama untuk pesan sukses
            $nama = $PengajuanCutiData['id_user'] ?? 'Tidak Diketahui';

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

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

    public function supervisor()
    {

        $session = session();
        $userRole = $session->get('role');
        $id_user = $session->get('id_user');

        $dataPengajuanCuti = $this->modelPengajuanCuti->getDataUntukSupervisor($id_user); // khusus supervisor
        $dataJenisCuti = $this->modelJenisCuti->getAllData();
        $dataBreadcumb = 'Verifikasi Supervisor';

        $data = [
            'Breadcumb' => $dataBreadcumb,
            'jeniscuti' => $dataJenisCuti,
            'pengajuancuti' => $dataPengajuanCuti,
        ];

        // Jika admin, kirim data user
        if ($userRole === 'admin') {
            $data['user'] = $this->modelUser->getAllDataUser();
        }

        return view('pengajuancuti/supervisor', $data);
    }


    public function prosesSupervisor()
    {
        $id = $this->request->getPost('id');
        $action = $this->request->getPost('action');
        $catatan = $this->request->getPost('catatan');

        $data = [
            'catatan_supervisor' => $catatan,
        ];

        if ($action === 'setujui') {
            $data['status_supervisor'] = 'disetujui';
        } elseif ($action === 'tolak') {
            $data['status_supervisor'] = 'ditolak';
        }

        $this->modelPengajuanCuti->update($id, $data);

        return $this->response->setJSON([
            'status' => 'success',
            'message' => 'Pengajuan berhasil diproses oleh supervisor.'
        ]);
    }

    public function manager()
    {
        $session = session();
        $userRole = $session->get('role');

        // Ambil hanya yang status_supervisor disetujui, tapi status_manager masih pending
        $dataPengajuanCuti = $this->modelPengajuanCuti->getDataUntukManager();

        $dataJenisCuti = $this->modelJenisCuti->getAllData();
        $dataBreadcumb = 'Verifikasi Manager';

        $data = [
            'Breadcumb' => $dataBreadcumb,
            'jeniscuti' => $dataJenisCuti,
            'pengajuancuti' => $dataPengajuanCuti,
        ];

        if ($userRole === 'admin') {
            $data['user'] = $this->modelUser->getAllDataUser();
        }

        return view('pengajuancuti/manager', $data);
    }

    public function prosesManager()
    {
        $id = $this->request->getPost('id');
        $action = $this->request->getPost('action');
        $catatan = $this->request->getPost('catatan');

        $data = [
            'status_manager' => $action === 'setujui' ? 'disetujui' : 'ditolak',
            'catatan_manager' => $catatan,
            'updated_at' => date('Y-m-d H:i:s')
        ];

        $this->modelPengajuanCuti->update($id, $data);

        return $this->response->setJSON([
            'status' => 'success',
            'message' => 'Pengajuan cuti berhasil diproses oleh Manager.'
        ]);
    }

    public function batalkanTindakan()
    {
        $id = $this->request->getPost('id');
        $role = $this->request->getPost('role');

        if ($role === 'manager') {
            $data = [
                'status_manager' => 'pending',
                'catatan_manager' => null,
            ];
        } elseif ($role === 'supervisor') {
            $data = [
                'status_supervisor' => 'pending',
                'catatan_supervisor' => null,
            ];
        } else {
            return $this->response->setJSON([
                'status' => 'error',
                'message' => 'Role tidak valid.'
            ]);
        }

        $this->modelPengajuanCuti->update($id, $data);

        return $this->response->setJSON([
            'status' => 'success',
            'message' => 'Tindakan berhasil dibatalkan.'
        ]);
    }
}
