<?php

namespace App\Http\Controllers;

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

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

    // Tampilkan Halaman Checkout
    public function checkoutPage(Request $request)
    {
        // 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'));
        }

        // Checkout dari Keranjang
        $cart = session()->get('cart');
        if ($cart && count($cart) > 0) {
            $items = collect();
            foreach ($cart as $id => $details) {
                $produk = Produk::find($id);
                if ($produk) {
                    $items->push((object) [
                        'id' => $id,
                        'produk' => $produk,
                        'nama_produk' => $details['name'],
                        'harga' => $details['price'],
                        'jumlah' => $details['quantity'],
                        'subtotal' => $details['price'] * $details['quantity'],
                        'foto' => $details['photo']
                    ]);
                }
            }
            $total_belanja = $items->sum('subtotal');
            return view('landing.checkout', compact('items', 'total_belanja'));
        }

        return redirect()->route('shop')->with('error', 'Keranjang Anda kosong, silakan belanja dulu.');
    }

    // fungsi prosesCheckout
    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 (Single Item) ---
                $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 (Cart) ---
                $cart = session()->get('cart');

                // Kelompokkan produk berdasarkan Petani ID
                $cartItems = [];
                foreach ($cart as $id => $details) {
                    $produk = Produk::find($id);
                    if ($produk) {
                        $cartItems[$produk->petani_id][] = [
                            'produk' => $produk,
                            'qty' => $details['quantity']
                        ];
                    }
                }

                foreach ($cartItems as $petani_id => $items) {
                    $subtotal_transaksi = 0;
                    $kode_invoice = 'INV/' . date('Ymd') . '/' . rand(1000, 9999);

                    // Membuat Header Transaksi per Petani
                    $transaksi = Transaksi::create([
                        'pembeli_id' => $pembeli_id,
                        'petani_id'  => $petani_id,
                        'tanggal_transaksi' => now(),
                        'alamat_pengiriman' => $request->alamat_pengiriman,
                        'total_harga' => 0,
                        'status' => 'menunggu konfirmasi',
                        'kode_invoice' => $kode_invoice,
                    ]);

                    foreach ($items as $item) {
                        $produk = $item['produk'];
                        $qty = $item['qty'];
                        $total_per_item = $produk->harga * $qty;
                        $subtotal_transaksi += $total_per_item;

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

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

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

                session()->forget('cart');
            }
        });

        return redirect()->route('pesanan.saya')->with('success', 'Pesanan berhasil dibuat! Menunggu konfirmasi petani.');
    }

    // Riwayat Pesanan
    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);

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

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


    // --- FITUR PETANI ---

    // Daftar Pesanan Masuk
    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 (Terima/Tolak/Kirim)
    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();

        if ($request->status == 'batal') {
            foreach ($transaksi->details as $detail) {
                $detail->produk->increment('stok', $detail->jumlah);
            }
        }

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

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

        // Ambil transaksi berdasarkan 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'));
    }
}
