<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\DetailTransaksi;
use App\Models\Transaksi;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use Barryvdh\DomPDF\Facade\Pdf;
use Carbon\Carbon;

class LaporanController extends Controller
{
    public function index(Request $request)
    {
        $query = $this->getFilteredDataQuery($request);

        // Fetch all matching records to compute correct stats
        $allRecords = (clone $query)->get()->map(function ($item) {
            $item->nama_produk = trim($item->nama_produk);
            return $item;
        });

        // 1. Paginate for web view
        $semuaDetail = $query->paginate(10);
        $semuaDetail->setCollection($semuaDetail->getCollection()->map(function ($item) {
            $item->nama_produk = trim($item->nama_produk);
            return $item;
        }));

        // 2. Statistik (calculated on ALL filtered records)
        $totalPendapatan = $allRecords->sum(fn($item) => $item->qty * $item->harga_satuan);
        $totalTransaksi = $allRecords->groupBy('transaksi_id')->count();
        $rataRata = $totalTransaksi > 0 ? ($totalPendapatan / $totalTransaksi) : 0;
        $totalTerjual = $allRecords->sum('qty');

        // 3. Statistik Produk Terlaris (Menggunakan nama_produk)
        $statistikProduk = $allRecords->map(function ($item) {
            $item->nama_produk = trim(strtoupper($item->nama_produk));
            return $item;
        })->groupBy('nama_produk')
            ->map(fn($item) => $item->sum('qty'));
        if ($statistikProduk->isNotEmpty()) {
            $namaProdukTerlaris = $statistikProduk->sortDesc()->keys()->first();
            $produkTerlaris = $statistikProduk->sortDesc()->first();
        } else {
            $namaProdukTerlaris = '-';
            $produkTerlaris = 0;
        }

        // 4. Data untuk Dropdown (Menggunakan nama_produk sebagai ID untuk filter)
        $semuaProduk = \App\Models\Produk::all();

        return view('admin.laporan', compact(
            'semuaDetail',
            'semuaProduk',
            'totalPendapatan',
            'totalTransaksi',
            'rataRata',
            'totalTerjual',
            'namaProdukTerlaris',
            'produkTerlaris'
        ));
    }

    private function getFilteredDataQuery(Request $request)
    {
        $query = DetailTransaksi::with('transaksi');

        // Filter Tanggal (via tanggal transaksi induk)
        if ($request->tgl_mulai) {
            $query->whereHas('transaksi', function ($q) use ($request) {
                $q->whereDate('created_at', '>=', $request->tgl_mulai);
            });
        }
        if ($request->tgl_selesai) {
            $query->whereHas('transaksi', function ($q) use ($request) {
                $q->whereDate('created_at', '<=', $request->tgl_selesai);
            });
        }

        // Filter Pembayaran (via transaksi induk)
        if ($request->pembayaran) {
            $query->whereHas('transaksi', function ($q) use ($request) {
                $q->where('metode_pembayaran', $request->pembayaran);
            });
        }

        // Filter Produk berdasarkan nama (karena produk_id tidak ada)
        if ($request->tab == 'barang' && $request->produk_id) {
            $query->where('nama_produk', $request->produk_id);
        }

        // Filter Search (cari di nama_produk, kode_transaksi, kasir)
        if ($request->search) {
            $search = $request->search;
            $query->where(function ($q) use ($search) {
                $q->where('nama_produk', 'like', "%{$search}%")
                    ->orWhereHas('transaksi', function ($q2) use ($search) {
                        $q2->where('kode_transaksi', 'like', "%{$search}%")
                            ->orWhere('kasir_name', 'like', "%{$search}%")
                            ->orWhere('metode_pembayaran', 'like', "%{$search}%");
                    });
            });
        }

        return $query;
    }

    public function exportExcel(Request $request)
    {
        $tab = $request->input('tab', 'pendapatan');
        $tgl_mulai = $request->input('tgl_mulai');
        $tgl_selesai = $request->input('tgl_selesai');
        $search = $request->input('search');

        $query = $this->getFilteredDataQuery($request);
        $data = $query->orderBy('created_at', 'desc')->get()->map(function ($item) {
            $item->nama_produk = trim($item->nama_produk);
            return $item;
        });

        $user = Auth::user()->name ?? 'Admin';
        $namaFile = "Laporan_Penjualan_Admin_" . ucfirst($tab) . "_" . date('Ymd_His') . ".xls";

        header("Content-Type: application/vnd.ms-excel; charset=utf-8");
        header("Content-Disposition: attachment; filename=$namaFile");
        header("Pragma: no-cache");
        header("Expires: 0");

        return view('admin.excel_laporan', [
            'data' => $data,
            'tab' => $tab,
            'tgl_mulai' => $tgl_mulai,
            'tgl_selesai' => $tgl_selesai,
            'search' => $search,
            'user' => $user
        ]);
    }

    public function exportPdf(Request $request)
    {
        $tab = $request->input('tab', 'pendapatan');
        $query = $this->getFilteredDataQuery($request);

        $data = $query->orderBy('created_at', 'desc')->get()->map(function ($item) {
            $item->nama_produk = trim($item->nama_produk);
            return $item;
        });

        // Calculate statistics for the PDF header cards
        $totalPendapatan = $data->sum(fn($item) => $item->qty * $item->harga_satuan);
        $totalTransaksi = $data->groupBy('transaksi_id')->count();
        $rataRata = $totalTransaksi > 0 ? ($totalPendapatan / $totalTransaksi) : 0;
        $totalTerjual = $data->sum('qty');

        $statistikProduk = $data->map(function ($item) {
            $item->nama_produk = trim(strtoupper($item->nama_produk));
            return $item;
        })->groupBy('nama_produk')
            ->map(fn($item) => $item->sum('qty'));

        if ($statistikProduk->isNotEmpty()) {
            $namaProdukTerlaris = $statistikProduk->sortDesc()->keys()->first();
            $produkTerlaris = $statistikProduk->sortDesc()->first();
        } else {
            $namaProdukTerlaris = '-';
            $produkTerlaris = 0;
        }

        $pdf = Pdf::loadView('admin.laporan_pdf', [
            'data' => $data,
            'totalPendapatan' => $totalPendapatan,
            'totalTransaksi' => $totalTransaksi,
            'rataRata' => $rataRata,
            'totalTerjual' => $totalTerjual,
            'namaProdukTerlaris' => $namaProdukTerlaris,
            'produkTerlaris' => $produkTerlaris
        ]);

        $pdf->setPaper('a4', 'portrait');
        return $pdf->download("Laporan_Penjualan_Admin_" . ucfirst($tab) . "_" . date('Ymd_His') . ".pdf");
    }

    public function getDetail($id)
    {
        try {
            // Pastikan Model Transaksi di-import di bagian atas
            $transaksi = Transaksi::with('details')->findOrFail($id);
            return view('admin.laporan_detail', compact('transaksi'))->render();
        } catch (\Exception $e) {
            return '<div class="modal-body text-danger">Data tidak ditemukan atau error: ' . $e->getMessage() . '</div>';
        }
    }
}
