<?php

namespace App\Controllers;

class Rekap extends BaseController
{
    protected $db;

    public function __construct()
    {
        $this->db = \Config\Database::connect();
    }

    public function index()
    {
        $level = session()->get('level');
        $id_opd_admin = session()->get('id_opd');
        $bulan = $this->request->getGet('bulan') ?? date('m');
        $tahun = $this->request->getGet('tahun') ?? date('Y');

        // Penentuan ID OPD yang akan ditampilkan
        $id_opd = $this->request->getGet('id_opd');
        if (!in_array($level, ['Superadmin', 'kabupaten'])) {
            $id_opd = $id_opd_admin; // Admin OPD terkunci ke OPD-nya sendiri
        }

        // --- 1. DATA PENDUKUNG ---
        $list_opd = $this->db->table('opd')->get()->getResultArray();

        // Ambil Hari Libur Nasional
        $libur_db = $this->db->table('hari_libur')
            ->where("MONTH(tanggal)", $bulan)->where("YEAR(tanggal)", $tahun)
            ->get()->getResultArray();
        $libur_nasional = [];
        foreach ($libur_db as $l) $libur_nasional[$l['tanggal']] = $l['keterangan'];

        // Ambil Jam Kerja Detail (Untuk Cek Hari Kerja Reguler)
        $jadwal_db = $this->db->table('jam_kerja_detail')->get()->getResultArray();
        $jadwal_kerja = [];
        foreach ($jadwal_db as $j) $jadwal_kerja[$j['id_jam_kerja']][$j['hari']] = true;

        // --- 2. LOGIKA REKAP (Hanya jika OPD dipilih) ---
        $rekap_final = [];
        $list_tanggal = [];

        if ($id_opd) {
            // Pengganti cal_days_in_month yang error kemarin
            $jumlah_hari = date('t', mktime(0, 0, 0, $bulan, 1, $tahun));
            for ($d = 1; $d <= $jumlah_hari; $d++) {
                $list_tanggal[] = date('Y-m-d', mktime(0, 0, 0, $bulan, $d, $tahun));
            }

            $pegawai = $this->db->table('pegawai')
                ->where('id_opd', $id_opd)
                // Gunakan CASE WHEN untuk mengurutkan Jabatan
                ->orderBy('CASE 
            WHEN level_jabatan LIKE "%Kepala Dinas%" THEN 1
            WHEN level_jabatan LIKE "%Sekretaris%" THEN 2
            WHEN level_jabatan LIKE "%Kepala Bidang%" THEN 3
            WHEN level_jabatan LIKE "%Fungsional%" THEN 4
            WHEN level_jabatan LIKE "%Staf%" THEN 5
            ELSE 6 
        END', 'ASC', false) // 'false' agar SQL tidak ditambahi backtick otomatis oleh CI4
                ->orderBy('nama_lengkap', 'ASC') // Urutan kedua berdasarkan nama
                ->get()->getResultArray();

            // Ambil semua data presensi bulan ini dalam satu query (Eager Loading)
            $presensi_raw = $this->db->table('presensi')
                ->join('pegawai', 'presensi.nip = pegawai.nip')
                ->where('pegawai.id_opd', $id_opd)
                ->where("MONTH(presensi.tanggal)", $bulan)->where("YEAR(presensi.tanggal)", $tahun)
                ->get()->getResultArray();

            $data_presensi = [];
            foreach ($presensi_raw as $p) $data_presensi[$p['nip']][$p['tanggal']] = $p;

            foreach ($pegawai as $pgw) {
                $row = ['nama' => $pgw['nama_lengkap'], 'nip' => $pgw['nip'], 'h' => 0, 't' => 0, 's' => 0, 'i' => 0, 'a' => 0, 'l' => 0, 'harian' => []];
                $id_jk = $pgw['id_jam_kerja'] ?? 1;

                foreach ($list_tanggal as $tgl) {
                    $nama_hari = $this->get_nama_hari(date('D', strtotime($tgl)));
                    $status = '';
                    $bg = '';

                    if (isset($data_presensi[$pgw['nip']][$tgl])) {
                        $p = $data_presensi[$pgw['nip']][$tgl];
                        if (in_array($p['status_masuk'], ['Hadir', 'Tepat Waktu'])) {
                            $status = 'H';
                            $bg = 'bg-success';
                            $row['h']++;
                        } elseif ($p['status_masuk'] == 'Terlambat') {
                            $status = 'T';
                            $bg = 'bg-warning text-dark';
                            $row['t']++;
                        } elseif (stripos($p['kategori'], 'Sakit') !== false) {
                            $status = 'S';
                            $bg = 'bg-info text-dark';
                            $row['s']++;
                        } else {
                            $status = 'I';
                            $bg = 'bg-primary';
                            $row['i']++;
                        }
                    } else {
                        if (isset($libur_nasional[$tgl])) {
                            $status = 'L';
                            $bg = 'bg-danger';
                            $row['l']++;
                        } elseif (isset($jadwal_kerja[$id_jk][$nama_hari])) {
                            $status = 'A';
                            $bg = 'bg-dark';
                            $row['a']++;
                        } else {
                            $status = 'L';
                            $bg = 'bg-secondary';
                            $row['l']++;
                        }
                    }
                    $row['harian'][$tgl] = ['code' => $status, 'bg' => $bg];
                }
                $rekap_final[] = $row;
            }
        }

        return view('admin/rekap_presensi', [
            'list_opd'     => $list_opd,
            'rekap'        => $rekap_final,
            'dates'        => $list_tanggal,
            'bulan'        => $bulan,
            'tahun'        => $tahun,
            'selected_opd' => $id_opd // Variabel yang tadinya undefined
        ]);
    }

    private function get_nama_hari($day)
    {
        $days = ['Sun' => 'Minggu', 'Mon' => 'Senin', 'Tue' => 'Selasa', 'Wed' => 'Rabu', 'Thu' => 'Kamis', 'Fri' => 'Jumat', 'Sat' => 'Sabtu'];
        return $days[$day];
    }

    public function keterlambatan()
    {
        $db      = \Config\Database::connect();
        $request = \Config\Services::request();
        $session = session();

        // 1. Ambil Input Filter
        $bulan   = $request->getGet('bulan') ?? date('m');
        $tahun   = $request->getGet('tahun') ?? date('Y');
        $id_opd  = $request->getGet('id_opd');

        // 2. Logika Hak Akses
        if ($session->get('level') == 'opd') {
            $id_opd = $session->get('id_opd');
        }

        // 3. Query Rekap Keterlambatan
        $query = $db->table('pegawai p')
            ->select('p.nama_lengkap, p.nip, p.level_jabatan,
              COUNT(pr.nip) as total_hadir, 
              SUM(CASE WHEN pr.status_masuk = "Terlambat" THEN 1 ELSE 0 END) as frekuensi_telat,
              SUM(COALESCE(pr.menit_keterlambatan, 0)) as total_menit_telat')
            ->join('presensi pr', 'p.nip = pr.nip AND MONTH(pr.tanggal) = "' . $bulan . '" AND YEAR(pr.tanggal) = "' . $tahun . '"', 'left')
            ->where('p.id_opd', $id_opd)
            ->groupBy('p.nip')

            // Tambahkan 'false' di akhir agar tidak di-escape otomatis oleh CI4
            ->orderBy('CASE 
        WHEN p.level_jabatan LIKE "%Kepala Dinas%" THEN 1
        WHEN p.level_jabatan LIKE "%Sekretaris%" THEN 2
        WHEN p.level_jabatan LIKE "%Kepala Bidang%" THEN 3
        WHEN p.level_jabatan LIKE "%Fungsional%" THEN 4
        WHEN p.level_jabatan LIKE "%Staf%" THEN 5
        ELSE 6 
    END', 'ASC', false)

            ->orderBy('total_menit_telat', 'DESC')
            ->get();

        // 4. Kirim Data ke View (Pastikan nama variabel 'list_opd' sesuai dengan di View)
        $data = [
            'title'        => 'Rekap Keterlambatan',
            'pegawai'      => $query->getResultArray(),
            // INI YANG KURANG TADI:
            'list_opd'     => $db->table('opd')->get()->getResultArray(),
            'bulan'        => $bulan,
            'tahun'        => $tahun,
            'selected_opd' => $id_opd
        ];

        return view('rekap/keterlambatan', $data);
    }
    public function tpp()
    {
        $db = \Config\Database::connect();
        $level = session()->get('level');
        $id_opd_admin = session()->get('id_opd');

        // Filter Bulan & Tahun
        $bulan = $this->request->getGet('bulan') ?? date('m');
        $tahun = $this->request->getGet('tahun') ?? date('Y');

        // Proteksi Akses OPD
        $id_opd = $this->request->getGet('id_opd');
        if (!in_array($level, ['Superadmin', 'kabupaten'])) {
            $id_opd = $id_opd_admin;
        }

        $data_pegawai = [];
        $nama_opd = "";

        if ($id_opd) {
            // 1. Ambil Nama OPD untuk Judul Laporan
            $opd_info = $db->table('opd')->where('id_opd', $id_opd)->get()->getRow();
            $nama_opd = $opd_info->nama_opd ?? "";

            // 2. Ambil List Pegawai Berdasarkan Hirarki Jabatan
            $pegawai = $db->table('pegawai p')
                ->where('p.id_opd', $id_opd)
                ->orderBy('CASE 
                WHEN p.level_jabatan LIKE "%Kepala Dinas%" THEN 1
                WHEN p.level_jabatan LIKE "%Sekretaris%" THEN 2
                WHEN p.level_jabatan LIKE "%Kepala Bidang%" THEN 3
                WHEN p.level_jabatan LIKE "%Fungsional%" THEN 4
                WHEN p.level_jabatan LIKE "%Staf%" THEN 5
                ELSE 6 
            END', 'ASC', false)
                ->orderBy('p.nama_lengkap', 'ASC')
                ->get()->getResultArray();

            // 3. Kalkulasi Data Presensi ke Kategori TPP
            foreach ($pegawai as $pgw) {
                $logs = $db->table('presensi')
                    ->where('id_pegawai', $pgw['id_pegawai'])
                    ->where('MONTH(tanggal)', $bulan)
                    ->where('YEAR(tanggal)', $tahun)
                    ->get()->getResultArray();

                // Init Counter sesuai Format 34 Kolom
                $res = [
                    'nama' => $pgw['nama_lengkap'],
                    'nip'  => $pgw['nip'],
                    'jab'  => $pgw['level_jabatan'],
                    'p1' => 0,
                    'p2' => 0,
                    'p3' => 0,
                    'p4' => 0, // Terlambat
                    'pc1' => 0,
                    'pc2' => 0,
                    'pc3' => 0,
                    'pc4' => 0, // Pulang Cepat
                    'c' => 0,
                    'i' => 0,
                    'a' => 0,
                    's' => 0,
                    'dl' => 0,
                    'tb' => 0
                ];

                foreach ($logs as $l) {
                    // Logika Terlambat (Tb)
                    if ($l['status_masuk'] == 'Terlambat') {
                        $m = $l['menit_keterlambatan'];
                        if ($m >= 10 && $m <= 30) $res['p1']++;
                        elseif ($m >= 31 && $m <= 60) $res['p2']++;
                        elseif ($m >= 61 && $m <= 90) $res['p3']++;
                        elseif ($m > 90) $res['p4']++;
                    }

                    // Logika Pulang Cepat (PC)
                    if ($l['status_pulang'] == 'Cepat Pulang') {
                        $res['pc1']++; // Contoh sederhana, bisa dipecah per menit jika kolom PC ada
                    }

                    // Kategori Absensi
                    if ($l['kategori'] == 'Cuti') $res['c']++;
                    elseif ($l['kategori'] == 'Izin') $res['i']++;
                    elseif ($l['kategori'] == 'Alpa') $res['a']++;
                    elseif ($l['kategori'] == 'Sakit') $res['s']++;
                }

                // Hitung Total Potongan Berdasarkan Bobot Pemda
                $res['total_persen'] = ($res['p1'] * 0.5) + ($res['p2'] * 1) + ($res['p3'] * 1.25) + ($res['p4'] * 1.5) + ($res['i'] * 2) + ($res['a'] * 5);
                $data_pegawai[] = $res;
            }
        }

        return view('admin/rekap_tpp', [
            'pegawai'      => $data_pegawai,
            'list_opd'     => $db->table('opd')->get()->getResultArray(),
            'bulan'        => $bulan,
            'tahun'        => $tahun,
            'selected_opd' => $id_opd,
            'nama_opd'     => $nama_opd
        ]);
    }
}
