<?php

namespace App\Http\Controllers;

use App\Models\Pelanggan;
use App\Models\Transaksi;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class LaporanController extends Controller
{
    /**
     * Halaman Dashboard Analisis CRM & Laporan Penjualan
     */
    public function index()
    {
        // Proteksi Hak Akses Multi-role (Admin/Owner)
        if (!session()->has('admin_logged') && !session()->has('owner_logged')) {
            return redirect('/login')->withErrors(['email' => 'Silakan login terlebih dahulu.']);
        }

        // ==========================================
        // 🎯 BLOCK 1: ANALISIS PELANGGAN LOYAL (CRM METRICS)
        // ==========================================

        // A. Top 5 Berdasarkan Poin Loyalitas Terbanyak
        $topPoin = Pelanggan::orderBy('poin_loyalitas', 'desc')->take(5)->get();

        // B. Top 5 Berdasarkan Kontribusi Omset Finansial (Monetary)
        $topBelanja = Pelanggan::select('pelanggans.*', DB::raw('SUM(transaksis.total_bayar) as total_omset'))
            ->join('transaksis', 'pelanggans.id', '=', 'transaksis.pelanggan_id')
            ->whereIn('transaksis.status', ['proses', 'dikirim', 'selesai'])
            ->groupBy(
                'pelanggans.id',
                'pelanggans.nama',
                'pelanggans.email',
                'pelanggans.password',
                'pelanggans.no_hp',
                'pelanggans.alamat',
                'pelanggans.poin_loyalitas',
                'pelanggans.created_at',
                'pelanggans.updated_at'
            )
            ->orderBy('total_omset', 'desc')
            ->take(5)
            ->get();

        // ==========================================
        // 📈 BLOCK 2: STATISTIK RINGKASAN UTAMA
        // ==========================================

        // Total Omset Keseluruhan dari Transaksi Sukses
        $totalOmset = Transaksi::whereIn('status', ['proses', 'dikirim', 'selesai'])->sum('total_bayar');

        // Volume Total Transaksi Sukses
        $transaksiSuksesCount = Transaksi::whereIn('status', ['proses', 'dikirim', 'selesai'])->count();

        // Statistik Penggunaan Kupon CRM (Transaksi yang memiliki promo_id)
        $kuponTerpakai = Transaksi::whereNotNull('promo_id')
            ->whereIn('status', ['proses', 'dikirim', 'selesai'])
            ->count();

        return view('admin.laporan_index', compact('topPoin', 'topBelanja', 'totalOmset', 'transaksiSuksesCount', 'kuponTerpakai'));
    }

    /**
     * 💰 RUTE 1: Cetak Laporan Keuangan (Rekapitulasi Penjualan)
     */
    public function cetak()
    {
        if (!session()->has('admin_logged') && !session()->has('owner_logged')) {
            return redirect('/login')->withErrors(['email' => 'Silakan login terlebih dahulu.']);
        }

        // 1. Mengambil data transaksi utama
        $transaksis = Transaksi::with('pelanggan')
            ->whereIn('status', ['proses', 'dikirim', 'selesai'])
            ->latest()
            ->get();

        $totalOmset = $transaksis->sum('total_bayar');
        $transaksiSuksesCount = $transaksis->count();
        $kuponTerpakai = $transaksis->whereNotNull('promo_id')->count();

        // 2. 🎯 FIX ERROR 3: Ambil juga data analitik CRM top member untuk disuplai ke bagian bawah laporan cetak lama lo
        $topPoin = Pelanggan::orderBy('poin_loyalitas', 'desc')->take(5)->get();

        $topBelanja = Pelanggan::select('pelanggans.*', DB::raw('SUM(transaksis.total_bayar) as total_omset'))
            ->join('transaksis', 'pelanggans.id', '=', 'transaksis.pelanggan_id')
            ->whereIn('transaksis.status', ['proses', 'dikirim', 'selesai'])
            ->groupBy(
                'pelanggans.id',
                'pelanggans.nama',
                'pelanggans.email',
                'pelanggans.password',
                'pelanggans.no_hp',
                'pelanggans.alamat',
                'pelanggans.poin_loyalitas',
                'pelanggans.created_at',
                'pelanggans.updated_at'
            )
            ->orderBy('total_omset', 'desc')
            ->take(5)
            ->get();

        // Gabungkan semua variabel ke dalam compact() agar template laporan_cetak lo terpenuhi semuanya
        return view('admin.laporan_cetak', compact(
            'transaksis',
            'totalOmset',
            'transaksiSuksesCount',
            'kuponTerpakai',
            'topPoin',
            'topBelanja'
        ));
    }

    /**
     * ⭐ RUTE 2: Cetak Analisis Pelanggan Loyal (CRM Report)
     */
    public function cetakPelanggan()
    {
        if (!session()->has('admin_logged') && !session()->has('owner_logged')) {
            return redirect('/login')->withErrors(['email' => 'Silakan login terlebih dahulu.']);
        }

        // Mengambil data seluruh pelanggan diurutkan dari poin tertinggi + total pengeluaran uang mereka
        $pelangganLoyal = Pelanggan::select('pelanggans.*', DB::raw('IFNULL(SUM(transaksis.total_bayar), 0) as total_spend'))
            ->leftJoin('transaksis', function ($join) {
                $join->on('pelanggans.id', '=', 'transaksis.pelanggan_id')
                    ->whereIn('transaksis.status', ['proses', 'dikirim', 'selesai']);
            })
            ->groupBy(
                'pelanggans.id',
                'pelanggans.nama',
                'pelanggans.email',
                'pelanggans.password',
                'pelanggans.no_hp',
                'pelanggans.alamat',
                'pelanggans.poin_loyalitas',
                'pelanggans.created_at',
                'pelanggans.updated_at'
            )
            ->orderBy('pelanggans.poin_loyalitas', 'desc')
            ->get();

        return view('admin.laporan_pelanggan_cetak', compact('pelangganLoyal'));
    }
}
