<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Produk;
use App\Models\Transaksi;
use App\Models\DetailTransaksi;
use App\Models\Cart;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

class TransaksiController extends Controller
{
    // --- FITUR PEMBELI ---

    /**
     * Tampilkan Halaman Checkout
     * Mendukung Beli Langsung dan Checkout dari Keranjang (Database)
     */
    public function checkoutPage(Request $request)
    {
        // Mendefinisikan ID Pembeli agar tidak error 'Undefined Variable'
        $pembeli_id = Auth::guard('pembeli')->id();

        // 1. LOGIKA BELI LANGSUNG (Buy Now)
        if ($request->has('produk_id')) {
            $produk = Produk::with('petani')->findOrFail($request->produk_id);
            $items = collect([
                (object) [
                    'id' => $produk->id,
                    'produk' => $produk,
                    'nama_produk' => $produk->nama_produk,
                    'harga' => $produk->harga,
                    'jumlah' => $request->qty ?? 1,
                    'subtotal' => $produk->harga * ($request->qty ?? 1),
                    'foto' => $produk->foto_produk
                ]
            ]);
            $total_belanja = $items->sum('subtotal');
            return view('landing.checkout', compact('items', 'total_belanja'));
        }

        // 2. LOGIKA CHECKOUT DARI KERANJANG (Database)
        $cartIds = $request->query('cart_ids');

        if (!$cartIds) {
            return redirect()->route('cart')->with('error', 'Pilih minimal satu produk di keranjang untuk dicheckout.');
        }

        $selectedIds = explode(',', $cartIds);

        // Ambil data dari Tabel Cart yang ID-nya dicentang oleh user
        $cartItems = Cart::with('produk.petani')
            ->where('pembeli_id', $pembeli_id)
            ->whereIn('id', $selectedIds)
            ->get();

        if ($cartItems->isEmpty()) {
            return redirect()->route('cart')->with('error', 'Barang di keranjang tidak ditemukan atau sudah dihapus.');
        }

        // Transformasi data agar sesuai dengan format yang dibaca di View Checkout
        $items = $cartItems->map(function ($item) {
            return (object) [
                'cart_id' => $item->id,
                'id' => $item->produk->id,
                'produk' => $item->produk,
                'nama_produk' => $item->produk->nama_produk,
                'harga' => $item->produk->harga,
                'jumlah' => $item->quantity,
                'subtotal' => $item->produk->harga * $item->quantity,
                'foto' => $item->produk->foto_produk
            ];
        });

        $total_belanja = $items->sum('subtotal');

        return view('landing.checkout', compact('items', 'total_belanja'));
    }

    /**
     * Proses Pembuatan Transaksi
     * Mengelompokkan pesanan berdasarkan Petani dan membersihkan keranjang
     */
    public function prosesCheckout(Request $request)
    {
        $request->validate([
            'alamat_pengiriman' => 'required|string',
            'metode_pembayaran' => 'required|in:cod',
        ]);

        $pembeli_id = Auth::guard('pembeli')->id();

        DB::transaction(function () use ($request, $pembeli_id) {
            
            if ($request->has('produk_id')) {
                // --- LOGIKA BELI LANGSUNG ---
                $produk = Produk::findOrFail($request->produk_id);
                $total_harga = $produk->harga * $request->jumlah;

                $transaksi = Transaksi::create([
                    'pembeli_id' => $pembeli_id,
                    'petani_id'  => $produk->petani_id,
                    'tanggal_transaksi' => now(),
                    'alamat_pengiriman' => $request->alamat_pengiriman,
                    'total_harga' => $total_harga,
                    'status' => 'menunggu konfirmasi', 
                    'kode_invoice' => 'INV/' . date('Ymd') . '/' . rand(1000, 9999),
                ]);

                DetailTransaksi::create([
                    'transaksi_id' => $transaksi->id,
                    'produk_id'    => $produk->id,
                    'jumlah'       => $request->jumlah,
                    'harga_satuan' => $produk->harga,
                    'subtotal'     => $total_harga,
                ]);

                $produk->decrement('stok', $request->jumlah);
                
            } else {
                // --- LOGIKA KERANJANG (DATABASE) ---
                if (!$request->cart_ids) {
                    throw new \Exception("ID keranjang tidak ditemukan.");
                }

                $cartIds = explode(',', $request->cart_ids);
                
                $cartItems = Cart::with('produk')
                    ->whereIn('id', $cartIds)
                    ->where('pembeli_id', $pembeli_id)
                    ->get();

                // Kelompokkan produk berdasarkan Petani ID agar Invoice terpisah per toko
                $groupedByPetani = [];
                foreach ($cartItems as $item) {
                    $groupedByPetani[$item->produk->petani_id][] = $item;
                }

                foreach ($groupedByPetani as $petani_id => $items) {
                    $transaksi = Transaksi::create([
                        'pembeli_id' => $pembeli_id,
                        'petani_id'  => $petani_id,
                        'tanggal_transaksi' => now(),
                        'alamat_pengiriman' => $request->alamat_pengiriman,
                        'total_harga' => 0, // Diupdate setelah menghitung subtotal
                        'status' => 'menunggu konfirmasi',
                        'kode_invoice' => 'INV/' . date('Ymd') . '/' . rand(1000, 9999),
                    ]);

                    $subtotal_transaksi = 0;
                    foreach ($items as $item) {
                        $total_per_item = $item->produk->harga * $item->quantity;
                        $subtotal_transaksi += $total_per_item;

                        DetailTransaksi::create([
                            'transaksi_id' => $transaksi->id,
                            'produk_id'    => $item->produk->id,
                            'jumlah'       => $item->quantity,
                            'harga_satuan' => $item->produk->harga,
                            'subtotal'     => $total_per_item,
                        ]);

                        $item->produk->decrement('stok', $item->quantity);
                    }

                    // Update total harga transaksi per petani
                    $transaksi->update(['total_harga' => $subtotal_transaksi]);
                }

                // OTOMATIS BERSIHKAN ITEM KERANJANG YANG SUDAH DIBELI
                Cart::whereIn('id', $cartIds)->delete();
            }
        });

        return redirect()->route('pesanan.saya')->with('success', 'Pesanan berhasil dibuat! Silakan pantau status pesanan Anda.');
    }

    // Riwayat Pesanan Pembeli
    public function pesananSaya()
    {
        $transaksis = Transaksi::with(['detailTransaksis.produk.petani'])
            ->where('pembeli_id', Auth::guard('pembeli')->id())
            ->latest()
            ->get();

        return view('landing.pesanan_saya', compact('transaksis'));
    }

    // Konfirmasi Pesanan Diterima oleh Pembeli
    public function konfirmasiSelesai($id)
    {
        $transaksi = Transaksi::where('pembeli_id', Auth::guard('pembeli')->id())
            ->findOrFail($id);

        if ($transaksi->status == 'dikirim') {
            $transaksi->status = 'selesai';
            $transaksi->save();
            return back()->with('success', 'Terima kasih! Pesanan telah selesai.');
        }

        return back()->with('error', 'Pesanan belum dikirim atau sudah selesai.');
    }


    // --- FITUR PETANI ---

    // Daftar Pesanan Masuk untuk Dashboard Petani
    public function pesananMasuk()
    {
        $petaniId = Auth::guard('petani')->id();

        $pesanans = Transaksi::whereHas('detailTransaksis.produk', function ($q) use ($petaniId) {
            $q->where('petani_id', $petaniId);
        })
            ->with(['pembeli', 'detailTransaksis.produk'])
            ->latest()
            ->get();

        return view('petani.pesanan.index', compact('pesanans'));
    }

    // Update Status Pesanan oleh Petani
    public function updateStatus(Request $request, $id)
    {
        $transaksi = Transaksi::findOrFail($id);

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

        $transaksi->status = $request->status;
        $transaksi->save();

        // Jika dibatalkan, kembalikan stok produk
        if ($request->status == 'batal') {
            foreach ($transaksi->detailTransaksis as $detail) {
                $detail->produk->increment('stok', $detail->jumlah);
            }
        }

        return back()->with('success', 'Status pesanan berhasil diperbarui.');
    }

    // Detail Pesanan untuk Sisi Petani
    public function pesananDetail($id)
    {
        $petaniId = Auth::guard('petani')->id();

        $pesanan = Transaksi::whereHas('detailTransaksis.produk', function ($q) use ($petaniId) {
            $q->where('petani_id', $petaniId);
        })
            ->with(['pembeli', 'detailTransaksis.produk'])
            ->findOrFail($id);

        return view('petani.pesanan.detail', compact('pesanan'));
    }
}