<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\HasilPrediksi;
use App\Exports\HasilPrediksiExport;
use App\Exports\HasilPrediksiRekapExport;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;

class HasilPrediksiControllers extends Controller
{
    public function index()
    {
        // Mengambil seluruh data pengguna dengan role user beserta total hari log prediksi
        $pangkalanList = User::where(['role' => 'user'])
            ->withCount('hasilPrediksi')
            ->get();

        // Hitung status mitigasi proyeksi lonjakan untuk setiap pangkalan secara real-time
        foreach ($pangkalanList as $pangkalan) {
            $monthlyData = HasilPrediksi::where(['user_id' => $pangkalan->id])
                ->select(DB::raw("DATE_FORMAT(tanggal, '%Y-%m') as bulan"), DB::raw("SUM(estimasi) as total_estimasi"))
                ->groupBy('bulan')
                ->get();

            if ($monthlyData->isEmpty()) {
                $pangkalan->status_mitigasi = 'Belum Ada Prediksi';
                continue;
            }

            // Cari nilai puncak bulanan dan rata-rata prediksi
            $sortedMonthly = $monthlyData->sortByDesc('total_estimasi');
            $peakValue = (int)$sortedMonthly->first()->total_estimasi;
            $averageValue = (int)round($monthlyData->pluck('total_estimasi')->avg());

            // Hitung persentase kenaikan puncak terhadap rata-rata bulanan
            $persentaseKenaikan = $averageValue > 0 ? (($peakValue - $averageValue) / $averageValue) * 100 : 0;

            // Sinkronisasi dengan aturan baku ambang batas di berkas Excel
            if ($persentaseKenaikan > 20.0) {
                $pangkalan->status_mitigasi = 'PERLU PERHATIAN KHUSUS';
            } else if ($persentaseKenaikan > 10.0) {
                $pangkalan->status_mitigasi = 'Pantauan Berkala';
            } else {
                $pangkalan->status_mitigasi = 'Stabil (Aman)';
            }
        }

        return view('admin.hasil-prediksi.index', compact('pangkalanList'));
    }

    public function show(Request $request, $id)
    {
        Carbon::setLocale('id');

        $pangkalan = User::where(['role' => 'user'])->findOrFail($id);
        
        $filterBulanTahun = $request->get('bulan_tahun'); 
        $sortOrder = $request->get('sort', 'desc');

        $query = HasilPrediksi::where('user_id', $id);

        if ($filterBulanTahun) {
            $yearMonth = explode('-', $filterBulanTahun);
            if (count($yearMonth) === 2) {
                $query->whereYear('tanggal', $yearMonth[0])
                      ->whereMonth('tanggal', $yearMonth[1]);
            }
        }

        $hasil_prediksi = $query->orderBy('tanggal', $sortOrder)->get();

        $availableMonths = HasilPrediksi::where('user_id', $id)
            ->selectRaw('YEAR(tanggal) as year, MONTH(tanggal) as month')
            ->groupBy('year', 'month')
            ->orderBy('year', 'desc')
            ->orderBy('month', 'desc')
            ->get()
            ->map(function ($item) {
                $date = Carbon::createFromDate($item->year, $item->month, 1)->locale('id');
                return [
                    'value' => $date->format('Y-m'),
                    'label' => $date->translatedFormat('F Y')
                ];
            });

        // LOGIKA PENYUSUNAN DETAIL MITIGASI LONJAKAN UNTUK PANEL UTAMA VIEW SHOW
        $allMonthlyData = HasilPrediksi::where(['user_id' => $id])
            ->select(
                DB::raw("DATE_FORMAT(tanggal, '%Y-%m') as bulan"), 
                DB::raw("SUM(estimasi) as total_estimasi")
            )
            ->groupBy('bulan')
            ->get();

        $statusPenting = 'Stabil (Aman)';
        $alasanAnalisis = 'Proyeksi fluktuasi permintaan cenderung stabil. Alokasi kuota reguler aman.';
        $persenKenaikanTeks = '0%';

        if ($allMonthlyData->isNotEmpty()) {
            $sortedMonthly = $allMonthlyData->sortByDesc('total_estimasi');
            $highestMonthRaw = $sortedMonthly->first()->bulan;
            
            $highestMonthLabel = Carbon::parse($highestMonthRaw . '-01')->translatedFormat('F Y');
            $peakValue = (int)$sortedMonthly->first()->total_estimasi;
            $averageValue = (int)round($allMonthlyData->pluck('total_estimasi')->avg());

            $persentaseKenaikan = $averageValue > 0 ? (($peakValue - $averageValue) / $averageValue) * 100 : 0;
            $persenKenaikanTeks = round($persentaseKenaikan, 1) . '%';

            if ($persentaseKenaikan > 20.0) {
                $statusPenting = 'PERLU PERHATIAN KHUSUS';
                $alasanAnalisis = 'Diproyeksikan mengalami lonjakan permintaan ekstrem sebesar ' . $persenKenaikanTeks . ' pada bulan ' . $highestMonthLabel . '. Alokasi pasokan wajib ditambah mendekati batas atas.';
            } else if ($persentaseKenaikan > 10.0) {
                $statusPenting = 'Pantauan Berkala';
                $alasanAnalisis = 'Terdapat indikasi kenaikan permintaan pasar tingkat sedang pada bulan ' . $highestMonthLabel . '. Diperlukan pemantauan stok berkala.';
            }
        }

        return view('admin.hasil-prediksi.show', compact(
            'pangkalan', 
            'hasil_prediksi', 
            'availableMonths', 
            'filterBulanTahun', 
            'sortOrder',
            'statusPenting',
            'alasanAnalisis',
            'persenKenaikanTeks'
        ));
    }

    public function export(Request $request, $id)
    {
        $pangkalan = User::where(['role' => 'user'])->findOrFail($id);
        $filterBulanTahun = $request->get('bulan_tahun');

        if ($filterBulanTahun) {
            $bulanIndo = Carbon::parse($filterBulanTahun . '-01')->locale('id')->translatedFormat('F_Y');
            $filename = 'Hasil_Prediksi_' . str_replace(' ', '_', $pangkalan->name) . '_' . $bulanIndo . '.xlsx';
        } else {
            $filename = 'Hasil_Prediksi_' . str_replace(' ', '_', $pangkalan->name) . '_Keseluruhan.xlsx';
        }
        
        return Excel::download(new HasilPrediksiExport($id, $filterBulanTahun), $filename);
    }

    public function exportRekapMassal()
    {
        $tanggalUnduh = Carbon::now()->format('d-m-Y');
        $filename = 'Rekap Hasil Prediksi Pangkalan_Diunduh tgl ' . $tanggalUnduh . '.xlsx';
        
        return Excel::download(new HasilPrediksiRekapExport, $filename);
    }
}