<?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)
    {
        if ($request->has('produk_id')) {
            $produk = Produk::with('petani')->findOrFail($request->produk_id);
            return view('landing.checkout', compact('produk'));
        }

        return redirect()->route('shop')->with('error', 'Silakan pilih produk yang ingin dibeli terlebih dahulu.');
    }

    // Proses Simpan Transaksi
    public function prosesCheckout(Request $request)
    {
        $request->validate([
            'produk_id' => 'required|exists:produks,id',
            'jumlah'    => 'required|integer|min:1',
            'alamat_pengiriman' => 'required|string',
            'metode_pembayaran' => 'required|in:cod', 
        ]);

        $produk = Produk::findOrFail($request->produk_id);

        if ($produk->stok < $request->jumlah) {
            return back()->with('error', 'Stok produk tidak mencukupi!');
        }

        $total_harga = $produk->harga * $request->jumlah;

        DB::transaction(function () use ($request, $produk, $total_harga) {
            $transaksi = Transaksi::create([
                'pembeli_id' => Auth::guard('pembeli')->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,
            ]);

            // C. Kurangi Stok
            $produk->decrement('stok', $request->jumlah);
        });

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

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

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


    // --- FITUR PETANI ---

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

        $pesanans = Transaksi::whereHas('details.produk', function ($q) use ($petaniId) {
            $q->where('petani_id', $petaniId);
        })
        ->with(['pembeli', 'details.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, pastikan transaksi tersebut memiliki produk milik petani ini
        $pesanan = Transaksi::whereHas('details.produk', function ($q) use ($petaniId) {
            $q->where('petani_id', $petaniId);
        })
        ->with(['pembeli', 'details.produk'])
        ->findOrFail($id);

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