<?php

namespace App\Http\Controllers\Customer;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Pesanan;
use App\Models\DetailPesanan;
use App\Models\Produk;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;

class PesananController extends Controller
{
    // Menampilkan daftar pesanan customer
    public function index()
    {
        $pesanans = Pesanan::where('user_id', auth()->id())
            ->whereIn('status', ['pending', 'dijadwalkan', 'dikirim'])
            ->latest()
            ->get();
        return view('customer.pesanan.index', compact('pesanans'));
    }

    // Menampilkan form buat pesanan
    public function create()
    {
        $produks = Produk::where('status', 'aktif')->get();
        return view('customer.pesanan.create', compact('produks'));
    }

    public function store(Request $request)
    {
        // 1. Validasi Input
        $request->validate([
            'tanggal_kirim' => 'required|date|after_or_equal:today',
            'qty'           => 'required|array',
            'qty.*'         => 'integer|min:0',
            'catatan'       => 'nullable|string|max:500',
        ]);

        // Filter produk yang dipesan (hanya qty > 0)
        $items = array_filter($request->qty, fn($q) => $q > 0);

        if (empty($items)) {
            return back()->with('error', 'Silakan pilih minimal satu produk.');
        }

        // 2. Gunakan DB::transaction agar data konsisten
        return DB::transaction(function () use ($request, $items) {
            
            // 3. Generate Kode Pesanan (ORD-01, ORD-02, dst)
            $latest = Pesanan::latest('id')->first();
            $number = $latest ? ((int)substr($latest->kode_pesanan, 4) + 1) : 1;
            $kode = 'ORD-' . str_pad($number, 2, '0', STR_PAD_LEFT);

            // 4. Buat Pesanan (Header)
            $pesanan = Pesanan::create([
                'kode_pesanan'  => $kode,
                'user_id'       => Auth::id(),
                'status'        => 'Pending',
                'tanggal_pesan' => now(),
                'tanggal_kirim' => $request->tanggal_kirim,
                'catatan'       => $request->catatan,
                'total_harga'   => 0, // Nilai awal
            ]);

            // 5. Simpan Detail Pesanan
            $total_seluruh = 0;
            foreach ($items as $produk_id => $qty) {
                $produk = Produk::findOrFail($produk_id);
                
                // Logika harga Mitra vs Normal
                $harga = ($produk->min_qty_mitra > 0 && $qty >= $produk->min_qty_mitra) 
                        ? $produk->harga_mitra 
                        : $produk->harga;
                
                $subtotal = $qty * $harga;
                $total_seluruh += $subtotal;

                DetailPesanan::create([
                    'pesanan_id' => $pesanan->id,
                    'produk_id'  => $produk_id,
                    'qty'        => $qty,
                    'harga'      => $harga,
                    'subtotal'   => $subtotal,
                ]);
            }

            // 6. Update Total Harga di Header
            $pesanan->update(['total_harga' => $total_seluruh]);

            return redirect()->route('customer.pesanan.index')
                            ->with('success', 'Pesanan ' . $kode . ' berhasil dibuat!');
        });
    }

    public function edit($id)
    {
        $pesanan = Pesanan::with('detailPesanan')->findOrFail($id);
        $produks = Produk::all(); // Pastikan variabel ini ada
        return view('customer.pesanan.edit', compact('pesanan', 'produks'));
    }

    public function update(Request $request, $id)
    {
        $pesanan = Pesanan::findOrFail($id);

        // Pastikan statusnya masih pending
        if (strtolower($pesanan->status) !== 'pending') {
            return redirect()->back()->with('error', 'Pesanan tidak bisa diubah.');
        }

        $total_harga_baru = 0;

        // Hapus detail lama agar bisa diganti dengan yang baru
        $pesanan->detailPesanan()->delete();

        // Loop data dari form
        foreach ($request->qty as $produk_id => $qty) {
            if ($qty > 0) {
                $produk = \App\Models\Produk::findOrFail($produk_id);

                // LOGIKA HARGA (HARUS SAMA DENGAN JAVASCRIPT)
                // Jika ada min_qty_mitra dan qty memenuhi syarat, pakai harga mitra
                if ($produk->min_qty_mitra > 0 && $qty >= $produk->min_qty_mitra) {
                    $harga_satuan = $produk->harga_mitra;
                } else {
                    $harga_satuan = $produk->harga;
                }

                $subtotal = $harga_satuan * $qty;

                // Simpan ke database
                $pesanan->detailPesanan()->create([
                    'produk_id' => $produk_id,
                    'qty' => $qty,
                    'subtotal' => $subtotal
                ]);

                $total_harga_baru += $subtotal;
            }
        }

        // Update total harga di header pesanan
        $pesanan->update([
            'tanggal_kirim' => $request->tanggal_kirim,
            'catatan' => $request->catatan,
            'total_harga' => $total_harga_baru
        ]);

        return redirect()->route('customer.pesanan.index')->with('success', 'Pesanan berhasil diupdate!');
    }

    public function destroy($id)
    {
        $pesanan = Pesanan::findOrFail($id);

        // 1. Cek kepemilikan (Penting!)
        if ($pesanan->user_id !== Auth::id()) {
            return back()->with('error', 'Anda tidak memiliki akses.');
        }

        // 2. Cek status
        if (strtolower($pesanan->status) !== 'pending') {
            return back()->with('error', 'Pesanan tidak bisa dihapus karena sudah dijadwalkan.');
        }

        // 3. Hapus data (Hapus detail dulu agar tidak error constraint)
        DB::transaction(function () use ($pesanan) {
            $pesanan->detailPesanan()->delete(); // Pastikan di model Pesanan ada relasi detailPesanan()
            $pesanan->delete();
        });

        return redirect()->route('customer.pesanan.index')->with('success', 'Pesanan berhasil dihapus.');
    }

    public function show($id)
    {
        $pesanan = \App\Models\Pesanan::with(['detailPesanan.produk']) // <-- Wajib ada with ini
                    ->where('user_id', auth()->id())
                    ->findOrFail($id);

        return view('customer.pesanan.show', compact('pesanan'));
    }

    public function riwayat()
    {
        $pesanans = Pesanan::where('user_id', auth()->id())
            ->whereIn('status', ['selesai'])
            ->latest()
            ->get();

        return view('customer.pesanan.riwayat', compact('pesanans'));
    }
}