<?php

namespace App\Http\Controllers\Shared;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

// Menggunakan pustaka resmi PhpSpreadsheet untuk menyusun berkas Excel
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;

class CetakRekapController extends Controller
{
    /**
     * Tampilkan halaman utama panel ekspor rekapitulasi laporan.
     */
    public function indexLaporan()
    {
        // Proteksi Hak Akses: Hanya Admin Provinsi dan Pejabat Dinas yang boleh mengekspor rekap
        $userId = session('simulasi_user_id', 1);
        $user = DB::table('users')->where('id', $userId)->first();
        $role = $user->role ?? 'provinsi_admin';

        if (!in_array($role, ['provinsi_admin', 'provinsi_pejabat'])) {
            abort(403, 'Akses Ditolak! Hanya Dinas Provinsi yang berwenang mengekspor rekapitulasi bantuan.');
        }

        $kegiatans = DB::table('kegiatan')->where('is_active', true)->get();
        $kabupatens = DB::table('regencies')->get();

        // Mengambil statistik ringkas usulan tervalidasi siap salur (diverifikasi & final)
        $totalUsulanFinal = DB::table('usulan')->whereIn('status', ['diverifikasi', 'final'])->count();
        $totalLuasFinal = DB::table('usulan_barang')
            ->join('usulan', 'usulan_barang.usulan_id', '=', 'usulan.id')
            ->whereIn('usulan.status', ['diverifikasi', 'final'])
            ->sum('usulan_barang.luas_pemanfaatan') ?? 0;

        return view('shared.laporan.index', compact('kegiatans', 'kabupatens', 'totalUsulanFinal', 'totalLuasFinal'));
    }

    /**
     * Memproses penyaringan data usulan tervalidasi dan mengalirkannya ke format XLSX Excel.
     */
    public function eksporExcel(Request $request)
    {
        $kegiatanId = $request->input('kegiatan_id');
        $regencyId = $request->input('regency_id');
        $status = $request->input('status');
        $formatTipe = $request->input('format_tipe', 'sk_grup'); // Default ke format Lampiran SK

        // --------------------------------------------------------------------------
        // ALUR PERTAMA: FORMAT LAMPIRAN SK KEPALA DINAS (OPSI 1 - GRUP DECORATOR)
        // --------------------------------------------------------------------------
        if ($formatTipe === 'sk_grup') {
            return $this->generateSkGrupExcel($kegiatanId, $regencyId, $status);
        }

        // --------------------------------------------------------------------------
        // ALUR KEDUA: FORMAT MATRIKS PENGADAAN BARANG (OPSI 2 - FLAT ROW HORIZONTAL)
        // --------------------------------------------------------------------------
        return $this->generatePengadaanFlatExcel($kegiatanId, $regencyId, $status);
    }

    /**
     * GENERATOR OPSI 1: Format Lampiran SK dengan Header Grup & Baris Vertikal Merged (SINKRON MULTI-ITEM)
     */
    private function generateSkGrupExcel($kegiatanId, $regencyId, $status)
    {
        // Kueri dasar untuk mengambil data usulan pokok beserta detail wilayah lengkap
        $query = DB::table('usulan')
            ->join('kegiatan', 'usulan.kegiatan_id', '=', 'kegiatan.id')
            ->join('kelompok_tani', 'usulan.kelompok_tani_id', '=', 'kelompok_tani.id')
            ->join('regencies', 'kelompok_tani.regency_id', '=', 'regencies.id')
            ->join('districts', 'kelompok_tani.district_id', '=', 'districts.id')
            ->join('villages', 'kelompok_tani.village_id', '=', 'villages.id')
            ->select(
                'usulan.id',
                'usulan.status',
                'usulan.akumulasi_skor',
                'usulan.kegiatan_id',
                'kegiatan.nama_kegiatan',
                'kegiatan.tahun_anggaran',
                'kelompok_tani.nama_kelompok',
                'kelompok_tani.nomor_induk',
                'kelompok_tani.no_hp_ketua',
                'regencies.nama_kabupaten',
                'districts.nama_kecamatan',
                'villages.nama_desa'
            );

        if ($kegiatanId) {
            $query->where('usulan.kegiatan_id', $kegiatanId);
        }
        if ($regencyId) {
            $query->where('kelompok_tani.regency_id', $regencyId);
        }
        if ($status) {
            $query->where('usulan.status', $status);
        } else {
            $query->whereIn('usulan.status', ['diverifikasi', 'final']);
        }

        // Urutkan berdasarkan skor kelayakan prioritas tertinggi
        $usulans = $query->orderBy('usulan.akumulasi_skor', 'DESC')->get();

        if ($usulans->isEmpty()) {
            return back()->withErrors(['error' => 'Tidak ditemukan data usulan yang cocok untuk diekspor!']);
        }

        // Kelompokkan usulan berdasarkan Kegiatan ID di memori PHP agar bisa membuat Header Grup
        $groupedUsulan = [];
        foreach ($usulans as $u) {
            $groupedUsulan[$u->kegiatan_id]['nama_program'] = $u->nama_kegiatan . " (TA " . $u->tahun_anggaran . ")";
            $groupedUsulan[$u->kegiatan_id]['items'][] = $u;
        }

        try {
            $spreadsheet = new Spreadsheet();
            $sheet = $spreadsheet->getActiveSheet();
            $sheet->setTitle('Lampiran SK Penerima');

            // Header Kop Laporan
            $sheet->setCellValue('A1', 'LAMPIRAN KEPUTUSAN KEPALA DINAS PERTANIAN JAWA TENGAH');
            $sheet->setCellValue('A2', 'DAFTAR KELOMPOK TANI PENERIMA MANFAAT ALOKASI BANTUAN SAPRODI');
            $sheet->setCellValue('A3', 'Diekspor pada: ' . date('d-m-Y H:i') . ' WIB | Ekspor Tipe: SK Lampiran (Multi-Item Terintegrasi)');

            $sheet->mergeCells('A1:L1');
            $sheet->mergeCells('A2:L2');
            $sheet->mergeCells('A3:L3');
            $sheet->getStyle('A1:A2')->getFont()->setBold(true)->setSize(12);
            $sheet->getStyle('A1:A3')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);

            $rowNum = 5;

            // Berputar melintasi grup program kegiatan
            foreach ($groupedUsulan as $kId => $group) {
                // Header Grup Kegiatan Besar
                $sheet->setCellValue('A' . $rowNum, "PROGRAM BANTUAN: " . strtoupper($group['nama_program']));
                $sheet->mergeCells('A' . $rowNum . ':L' . $rowNum);
                
                $sheet->getStyle('A' . $rowNum)->getFont()->setBold(true);
                $sheet->getStyle('A' . $rowNum)->getFont()->getColor()->setRGB('FFFFFF');
                $sheet->getStyle('A' . $rowNum)->applyFromArray([
                    'fill' => [
                        'fillType' => Fill::FILL_SOLID,
                        'startColor' => ['rgb' => '1E293B'], // Slate-800
                    ],
                ]);
                $sheet->getRowDimension($rowNum)->setRowHeight(24);
                $rowNum++;

                // Header Kolom Tabel
                $cols = [
                    'A' . $rowNum => 'NO',
                    'B' . $rowNum => 'KELOMPOK TANI',
                    'C' . $rowNum => 'DESA',
                    'D' . $rowNum => 'KECAMATAN',
                    'E' . $rowNum => 'KABUPATEN',
                    'F' . $rowNum => 'NOMOR INDUK',
                    'G' . $rowNum => 'NO HP KETUA',
                    'H' . $rowNum => 'LUAS (HA)',
                    'I' . $rowNum => 'KOMODITAS ALOKASI',
                    'J' . $rowNum => 'VOLUME',
                    'K' . $rowNum => 'SATUAN',
                    'L' . $rowNum => 'SKOR PRIORITAS'
                ];
                foreach ($cols as $cell => $val) {
                    $sheet->setCellValue($cell, $val);
                }
                $sheet->getStyle('A' . $rowNum . ':L' . $rowNum)->getFont()->setBold(true);
                $sheet->getStyle('A' . $rowNum . ':L' . $rowNum)->getFont()->getColor()->setRGB('FFFFFF');
                $sheet->getStyle('A' . $rowNum . ':L' . $rowNum)->applyFromArray([
                    'fill' => [
                        'fillType' => Fill::FILL_SOLID,
                        'startColor' => ['rgb' => '059669'], // Emerald-600
                    ],
                    'alignment' => [
                        'horizontal' => Alignment::HORIZONTAL_CENTER,
                        'vertical' => Alignment::VERTICAL_CENTER,
                    ]
                ]);
                $sheet->getRowDimension($rowNum)->setRowHeight(22);
                $rowNum++;

                // Mengisi baris data kelompok tani di bawah grup kegiatan bersangkutan
                foreach ($group['items'] as $index => $u) {
                    // Ambil luas pemanfaatan riil dari usulan_barang
                    $luasPemanfaatan = DB::table('usulan_barang')
                        ->where('usulan_id', $u->id)
                        ->value('luas_pemanfaatan') ?? 1.00;

                    // Ambil SEMUA daftar barang_kegiatan yang terdaftar di bawah program kegiatan ini!
                    $barangs = DB::table('barang_kegiatan')
                        ->where('kegiatan_id', $u->kegiatan_id)
                        ->orderBy('id', 'ASC')
                        ->get();

                    $barangCount = $barangs->count();
                    $startMergeRow = $rowNum;
                    $endMergeRow = $rowNum + max(0, $barangCount - 1);

                    // Isi data pokok kelompok tani
                    $sheet->setCellValue('A' . $rowNum, $index + 1);
                    $sheet->setCellValue('B' . $rowNum, $u->nama_kelompok);
                    $sheet->setCellValue('C' . $rowNum, $u->nama_desa);
                    $sheet->setCellValue('D' . $rowNum, $u->nama_kecamatan);
                    $sheet->setCellValue('E' . $rowNum, $u->nama_kabupaten);
                    $sheet->setCellValue('F' . $rowNum, $u->nomor_induk);
                    $sheet->setCellValue('G' . $rowNum, $u->no_hp_ketua ?? '-');
                    $sheet->setCellValue('H' . $rowNum, $luasPemanfaatan);
                    $sheet->setCellValue('L' . $rowNum, round($u->akumulasi_skor) . ' pts');

                    // Gabungkan baris secara vertikal jika ada lebih dari 1 item barang
                    if ($barangCount > 1) {
                        $sheet->mergeCells("A{$startMergeRow}:A{$endMergeRow}");
                        $sheet->mergeCells("B{$startMergeRow}:B{$endMergeRow}");
                        $sheet->mergeCells("C{$startMergeRow}:C{$endMergeRow}");
                        $sheet->mergeCells("D{$startMergeRow}:D{$endMergeRow}");
                        $sheet->mergeCells("E{$startMergeRow}:E{$endMergeRow}");
                        $sheet->mergeCells("F{$startMergeRow}:F{$endMergeRow}");
                        $sheet->mergeCells("G{$startMergeRow}:G{$endMergeRow}");
                        $sheet->mergeCells("H{$startMergeRow}:H{$endMergeRow}");
                        $sheet->mergeCells("L{$startMergeRow}:L{$endMergeRow}");
                    }

                    // Isi baris komoditas barang bantuan berdasarkan kalkulasi dinamis Luas Lahan * Volume per Hektar
                    foreach ($barangs as $bIdx => $b) {
                        $currRow = $startMergeRow + $bIdx;
                        
                        // Hitung volume alokasi secara dinamis (luas lahan x volume per hektar)
                        $volumeDinamis = round($luasPemanfaatan * ($b->volume_per_hektar ?? 1.00));

                        $sheet->setCellValue('I' . $currRow, $b->nama_barang);
                        $sheet->setCellValue('J' . $currRow, $volumeDinamis);
                        $sheet->setCellValue('K' . $currRow, $b->satuan);

                        $sheet->getStyle("A{$currRow}:L{$currRow}")->getAlignment()->setVertical(Alignment::VERTICAL_CENTER);
                        $sheet->getStyle("J{$currRow}")->getAlignment()->setHorizontal(Alignment::HORIZONTAL_RIGHT);
                        $sheet->getStyle("K{$currRow}")->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
                    }

                    // Terapkan penyeimbang rata tengah (center alignment) pada kolom gabungan
                    $sheet->getStyle("A{$startMergeRow}:E{$endMergeRow}")->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
                    $sheet->getStyle("F{$startMergeRow}:H{$endMergeRow}")->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
                    $sheet->getStyle("L{$startMergeRow}:L{$endMergeRow}")->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);

                    // Berikan batas garis tipis pada sel
                    $borderStyle = [
                        'borders' => [
                            'allBorders' => [
                                'borderStyle' => Border::BORDER_THIN,
                                'color' => ['rgb' => 'D1D5DB'],
                            ],
                        ],
                    ];
                    $sheet->getStyle("A{$startMergeRow}:L{$endMergeRow}")->applyFromArray($borderStyle);

                    $rowNum = $endMergeRow + 1; // Geser baris ke usulan kelompok tani berikutnya
                }

                $rowNum += 2; // Berikan sela baris kosong sebelum masuk ke program kegiatan selanjutnya
            }

            // Auto-fit kolom
            foreach (range('A', 'L') as $col) {
                $sheet->getColumnDimension($col)->setAutoSize(true);
            }

            $writer = new Xlsx($spreadsheet);
            $fileTitle = "rekap_sk_penerima_" . date('Ymd_His') . ".xlsx";
            
            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
            header('Content-Disposition: attachment; filename="' . $fileTitle . '"');
            header('Cache-Control: max-age=0');
            $writer->save('php://output');
            exit;

        } catch (\Exception $e) {
            return back()->withErrors(['error' => 'Gagal membuat rekap Excel Lampiran SK: ' . $e->getMessage()]);
        }
    }

    /**
     * GENERATOR OPSI 2: Format Matriks Pengadaan Logistik Berjejer ke Samping (Multi-Column Flat - SINKRON MULTI-ITEM)
     */
    private function generatePengadaanFlatExcel($kegiatanId, $regencyId, $status)
    {
        // Kueri mengambil data flat usulan untuk diletakkan berjejer beserta relasi detail wilayah lengkap
        $query = DB::table('usulan')
            ->join('kegiatan', 'usulan.kegiatan_id', '=', 'kegiatan.id')
            ->join('kelompok_tani', 'usulan.kelompok_tani_id', '=', 'kelompok_tani.id')
            ->join('regencies', 'kelompok_tani.regency_id', '=', 'regencies.id')
            ->join('districts', 'kelompok_tani.district_id', '=', 'districts.id')
            ->join('villages', 'kelompok_tani.village_id', '=', 'villages.id')
            ->select(
                'usulan.id',
                'usulan.status',
                'usulan.kegiatan_id',
                'usulan.akumulasi_skor',
                'kegiatan.nama_kegiatan',
                'kelompok_tani.nama_kelompok',
                'kelompok_tani.no_hp_ketua',
                'regencies.nama_kabupaten',
                'districts.nama_kecamatan',
                'villages.nama_desa'
            );

        if ($kegiatanId) {
            $query->where('usulan.kegiatan_id', $kegiatanId);
        }
        if ($regencyId) {
            $query->where('kelompok_tani.regency_id', $regencyId);
        }
        if ($status) {
            $query->where('usulan.status', $status);
        } else {
            $query->whereIn('usulan.status', ['diverifikasi', 'final']);
        }

        $usulans = $query->orderBy('usulan.akumulasi_skor', 'DESC')->get();

        if ($usulans->isEmpty()) {
            return back()->withErrors(['error' => 'Tidak ditemukan data usulan yang cocok untuk diekspor!']);
        }

        try {
            $spreadsheet = new Spreadsheet();
            $sheet = $spreadsheet->getActiveSheet();
            $sheet->setTitle('Matriks Pengadaan');

            // Kop Judul Laporan
            $sheet->setCellValue('A1', 'REKAPITULASI MATRIKS PENYEDIAAN LOGISTIK / PENGADAAN BARANG BANTUAN');
            $sheet->setCellValue('A2', 'DINAS PERTANIAN DAN PERKEBUNAN PROVINSI JAWA TENGAH');
            $sheet->setCellValue('A3', 'Format: Flat Row Matriks Pengadaan Berjejer ke Samping (Sesuai Seluruh Item Juknis)');

            // 🟢 PERBAIKAN DI SINI: Membetulkan rentang merger yang valid agar tidak melebihi indeks baris awal
            $sheet->mergeCells('A1:P1');
            $sheet->mergeCells('A2:P2');
            $sheet->mergeCells('A3:P3');
            $sheet->getStyle('A1:A2')->getFont()->setBold(true)->setSize(12);
            $sheet->getStyle('A1:A3')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);

            // Row Header Flat
            $headers = [
                'A5' => 'NO',
                'B5' => 'KELOMPOK TANI',
                'C5' => 'DESA',
                'D5' => 'KECAMATAN',
                'E5' => 'KABUPATEN',
                'F5' => 'PROGRAM BANTUAN',
                'G5' => 'LUAS (HA)',
                'H5' => 'KOMODITAS 1',
                'I5' => 'VOL 1',
                'J5' => 'KOMODITAS 2',
                'K5' => 'VOL 2',
                'L5' => 'KOMODITAS 3',
                'M5' => 'VOL 3',
                'N5' => 'SKOR PRIORITAS',
                'O5' => 'STATUS BERKAS',
                'P5' => 'NO HP KETUA'
            ];
            foreach ($headers as $cell => $val) {
                $sheet->setCellValue($cell, $val);
            }
            $sheet->getStyle('A5:P5')->getFont()->setBold(true);
            $sheet->getStyle('A5:P5')->getFont()->getColor()->setRGB('FFFFFF');
            $sheet->getStyle('A5:P5')->applyFromArray([
                'fill' => [
                    'fillType' => Fill::FILL_SOLID,
                    'startColor' => ['rgb' => '059669'], // Emerald-600
                ],
                'alignment' => [
                    'horizontal' => Alignment::HORIZONTAL_CENTER,
                    'vertical' => Alignment::VERTICAL_CENTER,
                ]
            ]);
            $sheet->getRowDimension('5')->setRowHeight(24);

            $rowNum = 6;
            
            // Array penampung untuk rekapitulasi hitung total logistik di bagian paling bawah
            $sumLogistik = [];

            foreach ($usulans as $index => $u) {
                $sheet->setCellValue('A' . $rowNum, $index + 1);
                $sheet->setCellValue('B' . $rowNum, $u->nama_kelompok);
                $sheet->setCellValue('C' . $rowNum, $u->nama_desa);
                $sheet->setCellValue('D' . $rowNum, $u->nama_kecamatan);
                $sheet->setCellValue('E' . $rowNum, $u->nama_kabupaten);
                $sheet->setCellValue('F' . $rowNum, $u->nama_kegiatan);

                // Ambil luas pemanfaatan riil dari usulan_barang
                $luasLahan = DB::table('usulan_barang')
                    ->where('usulan_id', $u->id)
                    ->value('luas_pemanfaatan') ?? 1.00;

                $sheet->setCellValue('G' . $rowNum, $luasLahan);

                // Ambil SEMUA daftar barang_kegiatan yang terdaftar di bawah program kegiatan ini!
                $barangs = DB::table('barang_kegiatan')
                    ->where('kegiatan_id', $u->kegiatan_id)
                    ->orderBy('id', 'ASC')
                    ->limit(3) // Batasi maksimal 3 item berjejer ke samping agar pas dengan kolom template Excel
                    ->get();

                // Taruh ke samping (Barang 1, Vol 1, dst...)
                $colsMapping = [
                    0 => ['name' => 'H', 'vol' => 'I'],
                    1 => ['name' => 'J', 'vol' => 'K'],
                    2 => ['name' => 'L', 'vol' => 'M']
                ];

                foreach ($colsMapping as $bIdx => $col) {
                    if (isset($barangs[$bIdx])) {
                        $b = $barangs[$bIdx];
                        
                        // Hitung volume alokasi secara dinamis (luas lahan x volume per hektar)
                        $volumeDinamis = round($luasLahan * ($b->volume_per_hektar ?? 1.00));

                        $sheet->setCellValue($col['name'] . $rowNum, $b->nama_barang);
                        $sheet->setCellValue($col['vol'] . $rowNum, $volumeDinamis . ' ' . $b->satuan);

                        // Masukkan ke array penampung rekap penjumlahan di bawah
                        $key = $b->nama_barang . ' (' . $b->satuan . ')';
                        if (!isset($sumLogistik[$key])) {
                            $sumLogistik[$key] = 0;
                        }
                        $sumLogistik[$key] += $volumeDinamis;
                    } else {
                        // Kosongkan jika usulan program ini hanya memiliki sedikit item barang
                        $sheet->setCellValue($col['name'] . $rowNum, '[Tidak ada]');
                        $sheet->setCellValue($col['vol'] . $rowNum, '0');
                    }
                }

                $sheet->setCellValue('N' . $rowNum, round($u->akumulasi_skor) . ' pts');
                $sheet->setCellValue('O' . $rowNum, strtoupper($u->status));
                $sheet->setCellValue('P' . $rowNum, $u->no_hp_ketua ?? '-'); // No HP diletakkan di kolom terakhir (P)

                // Alignments
                $sheet->getStyle('A' . $rowNum)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
                $sheet->getStyle('G' . $rowNum)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_RIGHT);
                $sheet->getStyle('I' . $rowNum)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_RIGHT);
                $sheet->getStyle('K' . $rowNum)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_RIGHT);
                $sheet->getStyle('M' . $rowNum)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_RIGHT);
                $sheet->getStyle('N' . $rowNum)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
                $sheet->getStyle('O' . $rowNum)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
                $sheet->getStyle('P' . $rowNum)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);

                $borderStyle = [
                    'borders' => [
                        'allBorders' => [
                            'borderStyle' => Border::BORDER_THIN,
                            'color' => ['rgb' => 'E5E7EB'],
                        ],
                    ],
                ];
                $sheet->getStyle("A{$rowNum}:P{$rowNum}")->applyFromArray($borderStyle);
                $sheet->getRowDimension($rowNum)->setRowHeight(20);

                $rowNum++;
            }

            // --- 5. MENULIS REKAPITULASI PENJUMLAHAN TOTAL LOGISTIK (PPK SUMMARY) ---
            $rowNum += 1; // Sela baris kosong
            $startSummaryRow = $rowNum;
            
            $sheet->setCellValue('A' . $rowNum, 'REKAPITULASI TOTAL VOL KEBUTUHAN LOGISTIK PENGADAAN RIIL:');
            $sheet->mergeCells("A{$rowNum}:P{$rowNum}");
            $sheet->getStyle('A' . $rowNum)->getFont()->setBold(true);
            $sheet->getStyle('A' . $rowNum)->getFont()->getColor()->setRGB('FFFFFF');
            $sheet->getStyle('A' . $rowNum)->applyFromArray([
                'fill' => [
                    'fillType' => Fill::FILL_SOLID,
                    'startColor' => ['rgb' => '1E293B'], // Slate-800
                ],
            ]);
            $sheet->getRowDimension($rowNum)->setRowHeight(22);
            $rowNum++;

            // Render isi rekap penjumlahan barang pengadaan secara detail ke bawah
            foreach ($sumLogistik as $barangNama => $totalVol) {
                $sheet->setCellValue('A' . $rowNum, $barangNama);
                $sheet->setCellValue('H' . $rowNum, $totalVol);
                $sheet->mergeCells("A{$rowNum}:G{$rowNum}"); // Gabungkan kolom detail Poktan & wilayah
                $sheet->mergeCells("H{$rowNum}:P{$rowNum}"); // Gabungkan sisa kolom volume ke samping

                $sheet->getStyle('A' . $rowNum)->getFont()->setBold(true);
                $sheet->getStyle('H' . $rowNum)->getFont()->setBold(true);
                $sheet->getStyle('H' . $rowNum)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT);

                $borderStyle = [
                    'borders' => [
                        'allBorders' => [
                            'borderStyle' => Border::BORDER_THIN,
                            'color' => ['rgb' => 'D1D5DB'],
                        ],
                    ],
                ];
                $sheet->getStyle("A{$rowNum}:P{$rowNum}")->applyFromArray($borderStyle);
                $sheet->getRowDimension($rowNum)->setRowHeight(20);
                $rowNum++;
            }

            // Auto-fit lebar kolom
            foreach (range('A', 'P') as $col) {
                $sheet->getColumnDimension($col)->setAutoSize(true);
            }

            $writer = new Xlsx($spreadsheet);
            $fileTitle = "rekap_logistik_pengadaan_" . date('Ymd_His') . ".xlsx";
            
            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
            header('Content-Disposition: attachment; filename="' . $fileTitle . '"');
            header('Cache-Control: max-age=0');
            $writer->save('php://output');
            exit;

        } catch (\Exception $e) {
            return back()->withErrors(['error' => 'Gagal membuat rekap Excel Matriks Pengadaan: ' . $e->getMessage()]);
        }
    }

    /**
     * Tampilkan halaman template Surat Keputusan (SK) formal siap cetak (Ctrl+P).
     */
    public function cetakSK($id)
    {
        $usulan = DB::table('usulan')
            ->join('kegiatan', 'usulan.kegiatan_id', '=', 'kegiatan.id')
            ->join('kelompok_tani', 'usulan.kelompok_tani_id', '=', 'kelompok_tani.id')
            ->join('regencies', 'kelompok_tani.regency_id', '=', 'regencies.id')
            ->join('districts', 'kelompok_tani.district_id', '=', 'districts.id')
            ->join('villages', 'kelompok_tani.village_id', '=', 'villages.id')
            ->select(
                'usulan.*',
                'kegiatan.nama_kegiatan',
                'kegiatan.tahun_anggaran',
                'kelompok_tani.nama_kelompok',
                'kelompok_tani.nomor_induk',
                'kelompok_tani.nama_ketua',
                'regencies.nama_kabupaten',
                'districts.nama_kecamatan',
                'villages.nama_desa'
            )
            ->where('usulan.id', $id)
            ->first();

        if (!$usulan) {
            return abort(404, 'Data usulan bantuan tidak ditemukan.');
        }

        $barang = DB::table('usulan_barang')
            ->join('barang_kegiatan', 'usulan_barang.barang_kegiatan_id', '=', 'barang_kegiatan.id')
            ->select('usulan_barang.*', 'barang_kegiatan.nama_barang', 'barang_kegiatan.satuan')
            ->where('usulan_barang.usulan_id', $id)
            ->get();

        $nomorSkDinas = "521/SK-" . str_pad($usulan->id, 4, '0', STR_PAD_LEFT) . "/DISTANBUN/" . $usulan->tahun_anggaran;

        return view('shared.cetak_sk_pdf', compact('usulan', 'barang', 'nomorSkDinas'));
    }

    /**
     * Proses unggah file dokumen fisik SK yang sudah ditandatangani oleh Kepala Dinas.
     */
    public function uploadSKFile(Request $request, $id)
    {
        $request->validate([
            'file_sk_fisik' => 'required|file|mimes:pdf|max:4096', // Maksimal 4MB PDF
        ], [
            'file_sk_fisik.required' => 'Harap pilih file dokumen SK fisik bertanda tangan terlebih dahulu!',
            'file_sk_fisik.mimes' => 'Format file dokumen wajib berupa dokumen PDF!',
            'file_sk_fisik.max' => 'Ukuran file dokumen SK maksimal adalah 4 Megabytes!'
        ]);

        try {
            if ($request->hasFile('file_sk_fisik')) {
                $file = $request->file('file_sk_fisik');
                $filename = 'sk_resmi_final_' . $id . '_' . time() . '.' . $file->getClientOriginalExtension();
                $file->move(public_path('uploads/sk_final/'), $filename);
                $savedPath = 'uploads/sk_final/' . $filename;

                DB::table('usulan')
                    ->where('id', $id)
                    ->update([
                        'catatan_terakhir' => 'Dokumen SK Fisik Ditandatangani Berhasil Diunggah.',
                        'updated_at' => now()
                    ]);

                DB::table('usulan_syarat')
                    ->insert([
                        'usulan_id' => $id,
                        'syarat_kegiatan_id' => 1,
                        'file_path' => $savedPath,
                        'status_verifikasi' => 'valid',
                        'skor_didapat' => 100.00,
                        'created_at' => now(),
                        'updated_at' => now()
                    ]);

                return redirect()->back()->with('success', 'Dokumen SK Penetapan bertanda tangan basah Kadin berhasil diunggah ke sistem!');
            }
        } catch (\Exception $e) {
            return redirect()->back()->withErrors(['error' => 'Gagal mengunggah berkas SK: ' . $e->getMessage()]);
        }
    }
}