<?php

namespace App\Controllers;

use App\Controllers\BaseController;

class LaporanController extends BaseController
{
    public function progres()
    {
        $db = \Config\Database::connect();
        $tahun = $this->request->getGet('tahun') ?? date('Y');
        $triwulan = $this->request->getGet('triwulan') ?? '1';

        $opd = $db->table('opd')->orderBy('nama_opd', 'ASC')->get()->getResultArray();
        
        foreach ($opd as &$o) {
            // Hitung total sub kegiatan yang harus dilaporkan
            $o['total_kegiatan'] = $db->table('programs')
                ->join('kegiatan', 'kegiatan.program_id = programs.id')
                ->join('sub_kegiatan', 'sub_kegiatan.kegiatan_id = kegiatan.id')
                ->where('programs.opd_id', $o['id'])
                ->countAllResults();

            // Hitung laporan yang sudah masuk (status apapun)
            $o['laporan_masuk'] = $db->table('realisasi')
                ->where('opd_id', $o['id'])
                ->where('tahun', $tahun)
                ->where('triwulan', $triwulan)
                ->countAllResults();
            
            // Hitung laporan yang sudah disetujui
            $o['status_selesai'] = $db->table('realisasi')
                ->where('opd_id', $o['id'])
                ->where('tahun', $tahun)
                ->where('triwulan', $triwulan)
                ->where('status', 'Disetujui')
                ->countAllResults();
            
            // Hitung persentase penyelesaian
            $o['persentase'] = $o['total_kegiatan'] > 0 ? round(($o['status_selesai'] / $o['total_kegiatan']) * 100) : 0;
        }

        $data = [
            'title' => 'Progres Evaluasi',
            'opd_data' => $opd,
            'tahun' => $tahun,
            'triwulan' => $triwulan
        ];
        return view('superadmin/laporan/progres', $data);
    }

    public function ekspor()
    {
        $db = \Config\Database::connect();
        $data = [
            'title' => 'Ekspor Laporan',
            'opd' => $db->table('opd')->orderBy('nama_opd', 'ASC')->get()->getResultArray()
        ];
        return view('superadmin/laporan/ekspor', $data);
    }

    public function eksporExcel()
    {
        $db = \Config\Database::connect();
        $tahun = (int)($this->request->getGet('tahun') ?? date('Y'));
        $triwulan = (int)($this->request->getGet('triwulan') ?? 1);
        $opdId = $this->request->getGet('opd_id');

        $builder = $db->table('realisasi')
            ->select('opd.nama_opd, programs.nama_program, kegiatan.nama_kegiatan, sub_kegiatan.kode_sub_kegiatan, sub_kegiatan.nama_sub_kegiatan, sub_kegiatan.target_kinerja as target_master, sub_kegiatan.satuan as satuan_master, realisasi.target_kinerja, realisasi.realisasi_kinerja, realisasi.realisasi_anggaran, realisasi.status, realisasi.tahun, realisasi.triwulan')
            ->join('sub_kegiatan', 'sub_kegiatan.id = realisasi.sub_kegiatan_id')
            ->join('kegiatan', 'kegiatan.id = sub_kegiatan.kegiatan_id')
            ->join('programs', 'programs.id = kegiatan.program_id')
            ->join('opd', 'opd.id = programs.opd_id')
            ->where('realisasi.tahun', $tahun)
            ->where('realisasi.triwulan', $triwulan)
            ->orderBy('opd.nama_opd, programs.nama_program, kegiatan.nama_kegiatan, sub_kegiatan.nama_sub_kegiatan');
        if ($opdId) {
            $builder->where('programs.opd_id', (int)$opdId);
        }
        $rows = $builder->get()->getResultArray();

        $headers = [
            'OPD', 'Program', 'Kegiatan', 'Kode Sub', 'Sub Kegiatan',
            'Target (Master)', 'Satuan (Master)', 'Target Triwulan', 'Realisasi Kinerja', 'Realisasi Anggaran', 'Status', 'Tahun', 'Triwulan'
        ];

        $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        $sheet->fromArray($headers, null, 'A1');
        $sheet->getStyle('A1:M1')->getFont()->setBold(true);

        $dataRows = [];
        foreach ($rows as $r) {
            $dataRows[] = [
                $r['nama_opd'],
                $r['nama_program'],
                $r['nama_kegiatan'],
                $r['kode_sub_kegiatan'],
                $r['nama_sub_kegiatan'],
                $r['target_master'],
                $r['satuan_master'],
                $r['target_kinerja'],
                $r['realisasi_kinerja'],
                $r['realisasi_anggaran'],
                $r['status'],
                $r['tahun'],
                $r['triwulan'],
            ];
        }
        if (!empty($dataRows)) {
            $sheet->fromArray($dataRows, null, 'A2');
        }
        foreach (range('A', 'M') as $col) {
            $sheet->getColumnDimension($col)->setAutoSize(true);
        }
        $fileName = 'rekap-evaluasi-' . $tahun . '-T' . $triwulan . '.xlsx';
        $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
        $tempPath = WRITEPATH . 'uploads/' . $fileName;
        $writer->save($tempPath);
        return $this->response->download($tempPath, null)->setFileName($fileName);
    }

    public function eksporPreview()
    {
        $db = \Config\Database::connect();
        $tahun = (int)($this->request->getGet('tahun') ?? date('Y'));
        $triwulan = (int)($this->request->getGet('triwulan') ?? 1);
        $opdId = $this->request->getGet('opd_id');

        $builder = $db->table('realisasi')
            ->select('opd.nama_opd, programs.nama_program, kegiatan.nama_kegiatan, sub_kegiatan.kode_sub_kegiatan, sub_kegiatan.nama_sub_kegiatan, sub_kegiatan.target_kinerja as target_master, sub_kegiatan.satuan as satuan_master, realisasi.target_kinerja, realisasi.realisasi_kinerja, realisasi.realisasi_anggaran, realisasi.status, realisasi.tahun, realisasi.triwulan')
            ->join('sub_kegiatan', 'sub_kegiatan.id = realisasi.sub_kegiatan_id')
            ->join('kegiatan', 'kegiatan.id = sub_kegiatan.kegiatan_id')
            ->join('programs', 'programs.id = kegiatan.program_id')
            ->join('opd', 'opd.id = programs.opd_id')
            ->where('realisasi.tahun', $tahun)
            ->where('realisasi.triwulan', $triwulan)
            ->orderBy('opd.nama_opd, programs.nama_program, kegiatan.nama_kegiatan, sub_kegiatan.nama_sub_kegiatan');
        if ($opdId) {
            $builder->where('programs.opd_id', (int)$opdId);
        }
        $rows = $builder->get()->getResultArray();

        $data = [
            'title' => 'Preview Ekspor PDF',
            'tahun' => $tahun,
            'triwulan' => $triwulan,
            'rows' => $rows,
            'opd_id' => $opdId
        ];
        return view('superadmin/laporan/preview', $data);
    }

    public function eksporPdf()
    {
        $db = \Config\Database::connect();
        $tahun = (int)($this->request->getGet('tahun') ?? date('Y'));
        $triwulan = (int)($this->request->getGet('triwulan') ?? 1);
        $opdId = $this->request->getGet('opd_id');

        $builder = $db->table('realisasi')
            ->select('opd.nama_opd, programs.nama_program, kegiatan.nama_kegiatan, sub_kegiatan.kode_sub_kegiatan, sub_kegiatan.nama_sub_kegiatan, sub_kegiatan.target_kinerja as target_master, sub_kegiatan.satuan as satuan_master, realisasi.target_kinerja, realisasi.realisasi_kinerja, realisasi.realisasi_anggaran, realisasi.status')
            ->join('sub_kegiatan', 'sub_kegiatan.id = realisasi.sub_kegiatan_id')
            ->join('kegiatan', 'kegiatan.id = sub_kegiatan.kegiatan_id')
            ->join('programs', 'programs.id = kegiatan.program_id')
            ->join('opd', 'opd.id = programs.opd_id')
            ->where('realisasi.tahun', $tahun)
            ->where('realisasi.triwulan', $triwulan)
            ->orderBy('opd.nama_opd, programs.nama_program, kegiatan.nama_kegiatan, sub_kegiatan.nama_sub_kegiatan');
        if ($opdId) {
            $builder->where('programs.opd_id', (int)$opdId);
        }
        $rows = $builder->get()->getResultArray();

        if (!class_exists('\\Dompdf\\Dompdf')) {
            return redirect()->to('/laporan/ekspor/preview?tahun='.$tahun.'&triwulan='.$triwulan.($opdId ? '&opd_id='.$opdId : ''))->with('error', 'Mesin PDF belum terpasang. Menampilkan pratinjau sebagai pengganti.');
        }

        $logoFile = FCPATH . 'img/LOGO PEMDA.jpg.jpeg';
        $logoSrc = '';
        if (is_file($logoFile)) {
            $mime = 'image/jpeg';
            $logoSrc = 'data:' . $mime . ';base64,' . base64_encode((string)file_get_contents($logoFile));
        } else {
            $logoSrc = base_url('img/LOGO PEMDA.jpg.jpeg');
        }
        $html = '<html><head><style>
        body { font-family: DejaVu Sans, Arial, Helvetica, sans-serif; font-size: 11px; }
        .header { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }
        .title { font-size: 14px; font-weight: bold; }
        table { width: 100%; border-collapse: collapse; }
        th, td { border: 1px solid #000; padding: 4px; }
        th { background: #f7f7f7; }
        .muted { color: #666; font-size: 10px; }
        tbody tr { page-break-inside: avoid; }
        </style></head><body>';
        $html .= '<div class="header"><img src="'.$logoSrc.'" width="40" /><div><div class="title">Rekapitulasi Capaian Kinerja</div><div class="muted">Tahun '.$tahun.' • Triwulan '.$triwulan.'</div></div></div>';
        $html .= '<table><thead><tr>
            <th>OPD</th><th>Program</th><th>Kegiatan</th><th>Kode Sub</th><th>Sub Kegiatan</th>
            <th>Target</th><th>Satuan</th><th>Realisasi</th><th>Realisasi Anggaran</th><th>Status</th>
        </tr></thead><tbody>';
        if (empty($rows)) {
            $html .= '<tr><td colspan="10" style="text-align:center;color:#777;">Belum ada data pada filter ini.</td></tr>';
        } else {
            foreach ($rows as $r) {
                $html .= '<tr>
                    <td>'.htmlspecialchars($r['nama_opd']).'</td>
                    <td>'.htmlspecialchars($r['nama_program']).'</td>
                    <td>'.htmlspecialchars($r['nama_kegiatan']).'</td>
                    <td>'.htmlspecialchars($r['kode_sub_kegiatan']).'</td>
                    <td>'.htmlspecialchars($r['nama_sub_kegiatan']).'</td>
                    <td>'.htmlspecialchars((string)$r['target_master']).'</td>
                    <td>'.htmlspecialchars((string)$r['satuan_master']).'</td>
                    <td>'.htmlspecialchars((string)$r['realisasi_kinerja']).'</td>
                    <td>Rp '.number_format((float)$r['realisasi_anggaran'], 0, ',', '.').'</td>
                    <td>'.htmlspecialchars($r['status']).'</td>
                </tr>';
            }
        }
        $html .= '</tbody></table></body></html>';

        
        $dompdf = \Config\Services::pdf(['isRemoteEnabled' => false, 'dpi' => 96]);
        $dompdf->loadHtml($html, 'UTF-8');
        $dompdf->setPaper('A4', 'landscape');
        $dompdf->render();
        $fileName = 'rekap-evaluasi-'.$tahun.'-T'.$triwulan.'.pdf';
        return $dompdf->stream($fileName, ['Attachment' => true]);
    }
}
