<?php

namespace App\Http\Controllers;

use App\Models\Penjualan;
use App\Models\Barang;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

/**
 * PenjualanController
 * Mencatat penjualan produk jadi ke konsumen.
 * Setiap penjualan mengurangi stok produk jadi.
 */
class PenjualanController extends Controller
{
    public function index(Request $request)
    {
        $query = Penjualan::with('barang');

        if ($request->filled('from')) {
            $query->whereDate('tanggal', '>=', $request->from);
        }
        if ($request->filled('to')) {
            $query->whereDate('tanggal', '<=', $request->to);
        }

        // Hitung total keseluruhan dari query yang SAMA (tanpa efek paginate)
        // clone() penting agar paginate() di bawah tidak mengkontaminasi query ini
        $queryForTotal = clone $query;
        $totalPendapatan = $queryForTotal->sum(DB::raw('qty * harga_satuan'));

        $penjualans = $query->latest('tanggal')->paginate(10)->withQueryString();
        
        // Total pendapatan khusus halaman ini (hanya item yang tampil di halaman aktif)
        $totalPendapatanHalamanIni = $penjualans->sum('total_harga');

        return view('penjualan.index', compact('penjualans', 'totalPendapatan', 'totalPendapatanHalamanIni'));
    }

    public function create()
    {
        // Hanya produk jadi yang bisa dijual, dan hanya yang stoknya ada
        $barangs = Barang::produkJadi()->where('stock', '>', 0)->orderBy('name')->get();

        return view('penjualan.create', compact('barangs'));
    }

    /**
     * Simpan penjualan baru & kurangi stok produk jadi.
     */
    public function store(Request $request)
    {
        $validated = $request->validate([
            'barang_id'    => ['required', 'exists:barangs,id'],
            'tanggal'      => ['required', 'date'],
            'qty'          => ['required', 'integer', 'min:1'],
            'harga_satuan' => ['required', 'numeric', 'min:0'],
            'pembeli'      => ['nullable', 'string', 'max:255'],
            'keterangan'   => ['nullable', 'string', 'max:500'],
        ], [
            'barang_id.required'   => 'Barang wajib dipilih.',
            'tanggal.required'     => 'Tanggal penjualan wajib diisi.',
            'qty.required'         => 'Jumlah wajib diisi.',
            'qty.min'              => 'Jumlah minimal 1.',
            'harga_satuan.required'=> 'Harga satuan wajib diisi.',
        ]);

        $barang = Barang::findOrFail($validated['barang_id']);

        // Validasi tipe barang
        if ($barang->type !== 'produk_jadi') {
            return back()->withErrors(['barang_id' => 'Hanya produk jadi yang dapat dijual.'])->withInput();
        }

        // Validasi kecukupan stok
        if ($barang->stock < $validated['qty']) {
            return back()
                ->withErrors([
                    'qty' => "Stok tidak mencukupi. Stok saat ini: {$barang->stock} {$barang->satuan}.",
                ])
                ->withInput();
        }

        DB::transaction(function () use ($validated, $barang) {
            Penjualan::create($validated);
            $barang->decrement('stock', $validated['qty']);
        });

        return redirect()->route('penjualan.index')
            ->with('success', 'Penjualan berhasil dicatat. Stok telah dikurangi.');
    }

    public function show(Penjualan $penjualan)
    {
        $penjualan->load('barang');
        return view('penjualan.show', compact('penjualan'));
    }

    /**
     * Memperbarui status pesanan.
     */
    public function update(Request $request, Penjualan $penjualan)
    {
        $validated = $request->validate([
            'status' => ['required', 'in:Menunggu Pembayaran,Diproses,Dikirim,Selesai,Dibatalkan'],
        ]);

        $penjualan->update(['status' => $validated['status']]);

        return redirect()->route('penjualan.index')
            ->with('success', 'Status pesanan berhasil diperbarui.');
    }

    public function destroy(Penjualan $penjualan)
    {
        DB::transaction(function () use ($penjualan) {
            // Kembalikan stok
            $penjualan->barang->increment('stock', $penjualan->qty);
            $penjualan->delete();
        });

        return redirect()->route('penjualan.index')
            ->with('success', 'Penjualan berhasil dihapus dan stok telah dikembalikan.');
    }

    /**
     * Memproses pesanan/pembelian produk jadi oleh UMKM.
     */
    public function beli(Request $request)
    {
        $validated = $request->validate([
            'barang_id'    => ['required', 'exists:barangs,id'],
            'tanggal'      => ['required', 'date'],
            'qty'          => ['required', 'integer', 'min:1'],
            'harga_satuan' => ['required', 'numeric', 'min:0'],
            'keterangan'   => ['nullable', 'string', 'max:500'],
        ], [
            'barang_id.required'   => 'Produk wajib dipilih.',
            'tanggal.required'     => 'Tanggal pesanan wajib diisi.',
            'tanggal.date'         => 'Format tanggal tidak valid.',
            'qty.required'         => 'Jumlah wajib diisi.',
            'qty.min'              => 'Jumlah minimal 1.',
            'harga_satuan.required'=> 'Harga satuan wajib diisi.',
        ]);

        $barang = Barang::findOrFail($validated['barang_id']);

        // Validasi tipe barang
        if ($barang->type !== 'produk_jadi') {
            return back()->withErrors(['barang_id' => 'Hanya produk jadi yang dapat dibeli.'])->withInput();
        }

        // Validasi kecukupan stok
        if ($barang->stock < $validated['qty']) {
            return back()
                ->withErrors([
                    'qty' => "Stok gudang tidak mencukupi. Stok saat ini: {$barang->stock} {$barang->satuan}.",
                ])
                ->withInput();
        }

        // Tentukan data transaksi
        $data = [
            'barang_id'    => $validated['barang_id'],
            'tanggal'      => $validated['tanggal'],
            'qty'          => $validated['qty'],
            'harga_satuan' => $validated['harga_satuan'],
            'pembeli'      => auth()->user()->name, // Nama UMKM pembeli
            'keterangan'   => $validated['keterangan'] ?? 'Pembelian UMKM secara online',
        ];

        DB::transaction(function () use ($data, $barang) {
            Penjualan::create($data);
            $barang->decrement('stock', $data['qty']);
        });

        return redirect()->route('dashboard')
            ->with('success', 'Pembelian berhasil! Pesanan Anda telah diproses.');
    }

    /**
     * Upload bukti pembayaran oleh UMKM.
     */
    public function uploadBukti(Request $request, Penjualan $penjualan)
    {
        // Pastikan transaksi milik UMKM yang sedang login
        if ($penjualan->pembeli !== auth()->user()->name) {
            abort(403, 'Anda tidak memiliki akses ke pesanan ini.');
        }

        $request->validate([
            'bukti_pembayaran' => ['required', 'image', 'mimes:jpg,jpeg,png,webp', 'max:2048'],
        ], [
            'bukti_pembayaran.required' => 'Bukti pembayaran wajib diunggah.',
            'bukti_pembayaran.image'    => 'Bukti pembayaran harus berupa gambar.',
            'bukti_pembayaran.mimes'    => 'Format gambar yang diperbolehkan: JPG, JPEG, PNG, WEBP.',
            'bukti_pembayaran.max'      => 'Ukuran gambar maksimal 2 MB.',
        ]);

        // Hapus file lama jika ada
        if ($penjualan->bukti_pembayaran && \Illuminate\Support\Facades\Storage::disk('public')->exists($penjualan->bukti_pembayaran)) {
            \Illuminate\Support\Facades\Storage::disk('public')->delete($penjualan->bukti_pembayaran);
        }

        $path = $request->file('bukti_pembayaran')->store('bukti_pembayaran', 'public');

        $penjualan->update([
            'bukti_pembayaran' => $path,
        ]);

        return redirect()->back()->with('success', 'Bukti pembayaran berhasil diunggah!');
    }
}
