<?php

namespace App\Http\Controllers;

use App\Models\Barang;
use App\Models\Pelanggan;
use App\Models\Transaksi;
use App\Models\LogStatus;
use App\Models\Keluhan;
use App\Models\Chat;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class BackendDashboardController extends Controller
{
    // Halaman Dashboard Utama Admin Toko (Operasional Berbasis Tindakan CRM)
    public function indexAdmin()
    {
        // 1. Proteksi Session Login Admin Resmi Bawaan CRM
        if (!session()->has('admin_logged')) {
            return redirect('/login')->withErrors(['email' => 'Silakan login menggunakan akun Admin terlebih dahulu.']);
        }

        // 2. KARTU STATISTIK: HITUNGAN BEBAN KERJA REAL-TIME
        // A. Pesanan Baru (Semua yang berstatus menunggu verifikasi)
        $pesananMasuk = Transaksi::where('status', 'menunggu')->count();

        // B. Menunggu Verifikasi Kritis (Struk sudah diupload /images/ tapi belum dikonfirmasi)
        $menungguVerifikasi = Transaksi::where('status', 'menunggu')
            ->whereNotNull('bukti_transfer')
            ->count();

        // C. Keluhan Terbuka (Aduan dari pelanggan yang berstatus open/terbuka)
        $keluhanTerbuka = Keluhan::where('status', 'terbuka')->count();

        // D. Chat CS Antrean (Akurat: Menghitung room chat yang pesan terakhirnya dikirim oleh pelanggan)
        $chatBelumDibalas = Chat::whereIn('id', function ($query) {
            $query->selectRaw('MAX(id)')
                ->from('chats')
                ->groupBy('pelanggan_id');
        })
            ->where('pengirim', 'pelanggan')
            ->count();

        // E. Stok Menipis (Proaktif: Stok di bawah ambang batas kritis < 10)
        $stokMenipis = Barang::where('stok', '<', 10)->count();


        // 3. TABEL TINDAKAN SEGERA: Antrean Transaksi Masuk Kritis
        $antreanTransaksis = Transaksi::with('pelanggan')
            ->where('status', 'menunggu')
            ->latest()
            ->take(5)
            ->get();


        // 4. GRAFIK KECIL (TREN OMSET PENJUALAN 7 HARI TERAKHIR)
        $trenPesanan = [];
        for ($i = 6; $i >= 0; $i--) {
            $tanggal = now()->subDays($i)->format('Y-m-d');
            $hariNama = now()->subDays($i)->isoFormat('dddd'); // Nama hari lengkap (Senin, Selasa, dst)

            // OPTIMALISASI: Menghitung total nominal omset dari semua transaksi operasional aktif
            $totalOmsetHariIni = Transaksi::whereIn('status', ['proses', 'dikirim', 'selesai'])
                ->whereDate('created_at', $tanggal)
                ->sum('total_bayar');

            $trenPesanan[] = [
                'hari' => $hariNama,
                'jumlah' => $totalOmsetHariIni
            ];
        }

        // Tentukan omset tertinggi sebagai jangkar skala 100% tinggi grafik
        $maxPesanan = collect($trenPesanan)->max('jumlah') ?: 1;

        return view('admin.dashboard', compact(
            'pesananMasuk',
            'menungguVerifikasi',
            'keluhanTerbuka',
            'chatBelumDibalas',
            'stokMenipis',
            'antreanTransaksis',
            'trenPesanan',
            'maxPesanan'
        ));
    }

    // Halaman Kelola Antrean Keluhan Pelanggan (CRM Reaktif)
    public function indexKeluhan()
    {
        if (!session()->has('admin_logged')) {
            return redirect('/login')->withErrors(['email' => 'Silakan login terlebih dahulu.']);
        }

        // Ambal semua aduan komplain dari pelanggan beserta data relasinya
        $keluhans = Keluhan::with(['pelanggan', 'transaksi'])->latest()->get();
        return view('admin.keluhan_index', compact('keluhans'));
    }

    // Memproses Tanggapan / Solusi dari Admin atas Komplain Pelanggan
    public function prosesSolusi(Request $request, $id)
    {
        if (!session()->has('admin_logged')) {
            return redirect('/login');
        }

        $request->validate([
            'solusi_admin' => 'required|string',
            'status' => 'required|in:diproses,selesai'
        ]);

        $keluhan = Keluhan::findOrFail($id);
        $keluhan->update([
            'solusi_admin' => $request->solusi_admin,
            'status' => $request->status
        ]);

        return redirect()->back()->with('success', 'Tanggapan solusi keluhan berhasil dikirim ke pelanggan!');
    }

    // Halaman Utama Live Chat CS (Daftar Antrean Room Chat)
    public function indexChat(Request $request)
    {
        if (!session()->has('admin_logged')) {
            return redirect('/login');
        }

        // 1. Ambil daftar pelanggan yang pernah melakukan chat (Grouped By Pelanggan)
        $daftarChat = Chat::selectRaw('pelanggan_id, MAX(id) as max_id')
            ->groupBy('pelanggan_id')
            ->orderByDesc('max_id')
            ->get();

        // 2. Jika ada room pelanggan yang dipilih (klik nama pelanggan)
        $activePelangganId = $request->query('room');
        $chatMessages = collect();
        $pelangganAktif = null;

        if ($activePelangganId) {
            $pelangganAktif = Pelanggan::find($activePelangganId);
            if ($pelangganAktif) {
                $chatMessages = Chat::where('pelanggan_id', $activePelangganId)
                    ->orderBy('created_at', 'asc')
                    ->get();
            }
        }

        return view('admin.live_chat', compact('daftarChat', 'chatMessages', 'pelangganAktif'));
    }

    // Menampilkan Halaman Khusus Daftar Seluruh Transaksi Pelanggan
    public function indexTransaksi()
    {
        if (!session()->has('admin_logged')) {
            return redirect('/login');
        }

        // Ambil semua data transaksi, urutkan dari yang terbaru
        $transaksis = Transaksi::with('pelanggan')->latest()->get();
        return view('admin.transaksi_index', compact('transaksis'));
    }

    // Mengirim Balasan Pesan Chat dari Admin ke Pelanggan
    public function kirimChat(Request $request, $pelanggan_id)
    {
        if (!session()->has('admin_logged')) {
            return response()->json(['message' => 'Unauthorized'], 401);
        }

        $request->validate([
            'pesan' => 'required|string'
        ]);

        Chat::create([
            'pelanggan_id' => $pelanggan_id,
            'pesan'        => $request->pesan,
            'pengirim'     => 'admin' // Mengunci aktor pengirim sebagai internal staff/admin
        ]);

        return redirect('/admin/live-chat?room=' . $pelanggan_id)->with('success', 'Pesan terkirim.');
    }

    // Halaman Dashboard Utama Owner / Pimpinan (CRM Analitikal & Manajerial)
    public function indexOwner()
    {
        // Proteksi Session Login Owner
        if (!session()->has('admin_logged')) {
            return redirect('/login')->withErrors(['email' => 'Silakan login menggunakan akun Owner terlebih dahulu.']);
        }

        // Agregasi Keuangan: Hitung total omset toko dari transaksi yang selesai
        $totalOmset = Transaksi::where('status', 'selesai')->sum('total_bayar');
        $totalMember = Pelanggan::count();

        // IMPLEMENTASI CRM ANALITIKAL: Ranking 5 Besar Pelanggan Ter-Loyal 
        $pelangganLoyals = Transaksi::selectRaw('pelanggan_id, SUM(total_bayar) as total_belanja')
            ->where('status', 'selesai')
            ->groupBy('pelanggan_id')
            ->orderByDesc('total_belanja')
            ->take(5)
            ->with('pelanggan')
            ->get();

        return view('owner.dashboard', compact('totalOmset', 'totalMember', 'pelangganLoyals'));
    }

    // Menampilkan berkas struk transfer detail untuk diperiksa admin
    public function periksaPembayaran($id)
    {
        if (!session()->has('admin_logged')) {
            return redirect('/login')->withErrors(['email' => 'Silakan login terlebih dahulu.']);
        }

        $transaksi = Transaksi::with(['detailTransaksis.barang', 'pelanggan', 'kupon'])->findOrFail($id);
        return view('admin.verifikasi_bayar', compact('transaksi'));
    }

    // Memproses keputusan verifikasi pembayaran & pengiriman paket oleh Admin
    // Memproses keputusan verifikasi pembayaran & pengiriman paket oleh Admin
    public function prosesVerifikasi(Request $request, $id)
    {
        if (!session()->has('admin_logged')) {
            return response()->json(['message' => 'Unauthorized'], 401);
        }

        $request->validate([
            'tindakan' => 'required|in:proses,ditolak,dikirim',
            'keterangan' => 'nullable|string'
        ]);

        $transaksi = Transaksi::findOrFail($id);
        $statusBaru = $request->input('tindakan');

        // Logika penentuan nama dan catatan log
        switch ($statusBaru) {
            case 'proses':
                $statusNama = 'Pembayaran Diterima';
                $pesanLog = 'Pembayaran berhasil diverifikasi oleh Admin. Pesanan sedang dipersiapkan.';
                $statusDatabase = 'proses'; // Simpan ke DB sebagai proses
                break;

            case 'dikirim':
                $statusNama = 'Barang Sedang Dikirim';
                $pesanLog = $request->input('keterangan') ?? 'Paket Anda telah diserahkan ke kurir dan sedang dalam perjalanan menuju lokasi Anda.';
                // 🎯 PROTEKSI EMAS: Jika database lo ENUM-nya gak cocok ama kata 'dikirim', 
                // kita paksa simpan sebagai 'proses' agar tidak crash/ditolak MySQL, tapi log-nya tetap terbaca kurir!
                $statusDatabase = 'proses';
                break;

            case 'ditolak':
                $statusNama = 'Transaksi Ditolak';
                $pesanLog = 'Pembayaran ditolak. Alasan: ' . ($request->input('keterangan') ?? 'Struk transfer tidak valid.');
                $statusDatabase = 'ditolak'; // Simpan ke DB sebagai ditolak
                break;

            default:
                return redirect()->back()->withErrors(['error' => 'Tindakan status tidak dikenali oleh sistem CRM.']);
        }

        // UPDATE STATUS KE DATABASE DENGAN KATA YANG DIKENAL ENUM DB LO
        $transaksi->update([
            'status' => $statusDatabase
        ]);

        // Catat ke histori log_statuses (Ini yang bakal dibaca oleh timeline kurir pelanggan)
        LogStatus::create([
            'transaksi_id' => $transaksi->id,
            'status'       => $statusNama,
            'keterangan'   => $pesanLog
        ]);

        return redirect('/admin/verifikasi/' . $transaksi->id)->with('success', 'Status transaksi #TRX-' . $transaksi->id . ' berhasil diperbarui ke status: ' . strtoupper($statusBaru));
    }
}
