<?php

namespace App\Http\Controllers;

use App\Models\KeranjangItem;
use App\Models\Pesanan;
use App\Models\DetailPesanan;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;

class CheckoutController extends Controller
{
    /**
     * Proses checkout hanya untuk item yang dipilih
     * Mendukung AJAX request dari halaman keranjang
     */
    public function process(Request $request)
    {
        $user = Auth::user();
        
        // Cek apakah request dari AJAX
        $isAjax = $request->ajax() || $request->wantsJson();
        
        try {
            // Ambil ID item yang dipilih dari form atau JSON
            if ($isAjax) {
                $selectedItemIds = $request->input('selected_items', []);
                // Jika format dari AJAX adalah array of objects dengan cart_item_id
                if (isset($selectedItemIds[0]['cart_item_id'])) {
                    $selectedItemIds = array_column($selectedItemIds, 'cart_item_id');
                }
            } else {
                $selectedItemIds = $request->input('selected_items', []);
            }
            
            if (empty($selectedItemIds)) {
                if ($isAjax) {
                    return response()->json([
                        'success' => false,
                        'message' => 'Silakan pilih minimal satu produk untuk checkout!'
                    ], 400);
                }
                return back()->with('error', 'Silakan pilih minimal satu produk untuk checkout!');
            }
            
            // Ambil hanya item yang dipilih dan milik user yang login
            $items = KeranjangItem::where('id_users', $user->id)
                        ->whereIn('id', $selectedItemIds)
                        ->with(['produk', 'varian'])
                        ->get();
            
            if ($items->isEmpty()) {
                if ($isAjax) {
                    return response()->json([
                        'success' => false,
                        'message' => 'Item yang dipilih tidak valid!'
                    ], 400);
                }
                return back()->with('error', 'Item yang dipilih tidak valid!');
            }
            
            DB::beginTransaction();
            
            // Cek stok semua item yang dipilih sebelum proses
            foreach ($items as $item) {
                $stokTersedia = $item->varian ? $item->varian->stok : $item->produk->stok;
                $namaProduk = $item->produk->nama;
                if ($item->varian) {
                    $namaProduk .= " ({$item->varian->ukuran}/{$item->varian->warna})";
                }
                
                if ($item->jumlah > $stokTersedia) {
                    throw new \Exception("Stok produk \"{$namaProduk}\" tidak mencukupi! (Stok tersedia: {$stokTersedia})");
                }
            }
            
            // Hitung total harga hanya dari item yang dipilih
            $total = $items->sum(function($item) { 
                $harga = $item->varian ? $item->varian->harga : $item->produk->harga;
                return $item->jumlah * $harga; 
            });
            
            // Proses alamat (untuk non-AJAX atau AJAX dengan data alamat)
            $pesanan = null;
            
            // Cek apakah request mengirimkan data alamat
            if (!$isAjax || ($request->has('provinsi_id') && $request->has('alamat_tujuan'))) {
                // Validasi alamat
                $validatedData = $request->validate([
                    'provinsi_id' => 'required|exists:provinces,id',
                    'kota_id' => 'required|exists:cities,id',
                    'kecamatan_id' => 'required|exists:districts,id',
                    'desa_id' => 'required|exists:villages,id',
                    'alamat_tujuan' => 'required|string',
                    'kode_pos' => 'nullable|string',
                ]);
                
                // Dapatkan nama kota untuk fallback 'kota' column
                $kotaName = \App\Models\Regency::find($request->kota_id)?->name ?? '';
                
                // Buat pesanan dengan alamat
                $pesanan = Pesanan::create([
                    'user_id'          => $user->id,
                    'provinsi_id'      => $request->provinsi_id,
                    'kota_id'          => $request->kota_id,
                    'kecamatan_id'     => $request->kecamatan_id,
                    'desa_id'          => $request->desa_id,
                    'alamat_tujuan'    => $request->alamat_tujuan,
                    'kode_pos'         => $request->kode_pos,
                    'kota'             => $kotaName,
                    'tanggal_pesanan'  => now()->toDateString(),
                    'total_harga'      => $total,
                    'status'           => 'menunggu',
                ]);
            } else {
                // Untuk AJAX request tanpa alamat, ambil dari address book utama
                $alamatUtama = $user->alamatUtama;

                $pesanan = Pesanan::create([
                    'user_id'          => $user->id,
                    'provinsi_id'      => $alamatUtama ? $alamatUtama->provinsi_id : null,
                    'kota_id'          => $alamatUtama ? $alamatUtama->kota_id : null,
                    'kecamatan_id'     => $alamatUtama ? $alamatUtama->kecamatan_id : null,
                    'desa_id'          => $alamatUtama ? $alamatUtama->desa_id : null,
                    'alamat_tujuan'    => $alamatUtama ? $alamatUtama->alamat_lengkap : null,
                    'kode_pos'         => $alamatUtama ? $alamatUtama->kode_pos : null,
                    'kota'             => $alamatUtama ? ($alamatUtama->regency->name ?? '') : null,
                    'tanggal_pesanan'  => now()->toDateString(),
                    'total_harga'      => $total,
                    'status'           => 'menunggu',
                ]);
            }
            
            // Buat detail pesanan untuk setiap item yang dipilih
            foreach ($items as $item) {
                $harga = $item->varian ? $item->varian->harga : $item->produk->harga;
                $subtotal = $item->jumlah * $harga;
                
                DetailPesanan::create([
                    'pesanan_id' => $pesanan->id,
                    'produk_id'  => $item->id_produk,
                    'varian_id'  => $item->produk_varian_id ?? null,
                    'jumlah'     => $item->jumlah,
                    'harga'      => $harga,
                    'subtotal'   => $subtotal,
                ]);
                
                // Kurangi stok (sesuai dengan varian atau produk)
                if ($item->varian) {
                    $item->varian->decrement('stok', $item->jumlah);
                    \App\Models\StockLog::create([
                        'produk_varian_id' => $item->varian->id,
                        'user_id' => auth()->id(),
                        'tipe_pergerakan' => 'out',
                        'jumlah' => $item->jumlah,
                        'stok_sebelum' => $item->varian->stok + $item->jumlah,
                        'stok_sesudah' => $item->varian->stok,
                        'keterangan' => 'Checkout / Pesanan #' . $pesanan->id,
                    ]);
                } else {
                    $item->produk->decrement('stok', $item->jumlah);
                }
                
                // Hapus item dari keranjang
                $item->delete();
            }
            
            DB::commit();
            
            // Response berdasarkan tipe request
            if ($isAjax) {
                return response()->json([
                    'success' => true,
                    'redirect_url' => route('pesanans.bayar', $pesanan->id),
                    'pesanan_id' => $pesanan->id,
                    'message' => 'Lanjutkan proses checkout (Alamat & Pembayaran)!'
                ]);
            }
            
            return redirect()->route('pesanans.bayar', $pesanan->id)
                   ->with('success', 'Silakan lengkapi alamat & pembayaran Anda!');
            
        } catch (\Illuminate\Validation\ValidationException $e) {
            DB::rollBack();
            if ($isAjax) {
                return response()->json([
                    'success' => false,
                    'message' => 'Data alamat tidak lengkap!',
                    'errors' => $e->errors()
                ], 422);
            }
            return back()->withErrors($e->errors())->withInput();
            
        } catch (\Exception $e) {
            DB::rollBack();
            if ($isAjax) {
                return response()->json([
                    'success' => false,
                    'message' => $e->getMessage()
                ], 500);
            }
            return back()->with('error', $e->getMessage());
        }
    }
    
    /**
     * Get checkout page (form alamat sebelum checkout)
     */
    public function index(Request $request)
    {
        $user = Auth::user();
        
        // Ambil item yang dipilih dari session atau request
        $selectedItemIds = $request->input('items', []);
        
        if (empty($selectedItemIds)) {
            // Jika ada di session
            $selectedItemIds = session('checkout_items', []);
        }
        
        if (empty($selectedItemIds)) {
            return redirect()->route('cart.index')->with('error', 'Tidak ada item untuk di-checkout');
        }
        
        // Ambil data item yang dipilih
        $items = KeranjangItem::where('id_users', $user->id)
                    ->whereIn('id', $selectedItemIds)
                    ->with(['produk', 'varian'])
                    ->get();
        
        if ($items->isEmpty()) {
            return redirect()->route('cart.index')->with('error', 'Item yang dipilih tidak valid');
        }
        
        $total = $items->sum(function($item) {
            $harga = $item->varian ? $item->varian->harga : $item->produk->harga;
            return $item->jumlah * $harga;
        });
        
        // Simpan kembali ke session untuk digunakan di proses checkout
        session(['checkout_items' => $selectedItemIds]);
        
        return view('customer.checkout', [
            'items' => $items,
            'total' => $total,
            'selectedItemIds' => $selectedItemIds
        ]);
    }

    /**
     * Checkout langsung (Beli Sekarang)
     */
    public function processDirect(Request $request)
    {
        $request->validate([
            'produk_varian_id' => 'required|exists:produk_varians,id',
            'jumlah' => 'required|integer|min:1'
        ]);

        $user = Auth::user();
        $varian = \App\Models\ProdukVarian::with('produk')->findOrFail($request->produk_varian_id);
        $jumlah = $request->jumlah;

        if ($jumlah > $varian->stok) {
            return back()->with('error', 'Stok tidak mencukupi untuk jumlah yang diminta.');
        }

        DB::beginTransaction();
        try {
            $harga = $varian->harga;
            $subtotal = $harga * $jumlah;

            $alamatUtama = $user->alamatUtama;

            $pesanan = Pesanan::create([
                'user_id'          => $user->id,
                'provinsi_id'      => $alamatUtama ? $alamatUtama->provinsi_id : null,
                'kota_id'          => $alamatUtama ? $alamatUtama->kota_id : null,
                'kecamatan_id'     => $alamatUtama ? $alamatUtama->kecamatan_id : null,
                'desa_id'          => $alamatUtama ? $alamatUtama->desa_id : null,
                'alamat_tujuan'    => $alamatUtama ? $alamatUtama->alamat_lengkap : null,
                'kode_pos'         => $alamatUtama ? $alamatUtama->kode_pos : null,
                'kota'             => $alamatUtama ? ($alamatUtama->regency->name ?? '') : null,
                'tanggal_pesanan'  => now()->toDateString(),
                'total_harga'      => $subtotal,
                'status'           => 'menunggu',
            ]);

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

            $varian->decrement('stok', $jumlah);
            
            \App\Models\StockLog::create([
                'produk_varian_id' => $varian->id,
                'user_id' => auth()->id(),
                'tipe_pergerakan' => 'out',
                'jumlah' => $jumlah,
                'stok_sebelum' => $varian->stok + $jumlah,
                'stok_sesudah' => $varian->stok,
                'keterangan' => 'Checkout / Pesanan #' . $pesanan->id,
            ]);

            DB::commit();

            return redirect()->route('pesanans.bayar', $pesanan->id)
                   ->with('success', 'Silakan lengkapi alamat & pembayaran Anda!');
        } catch (\Exception $e) {
            DB::rollBack();
            return back()->with('error', 'Terjadi kesalahan sistem: ' . $e->getMessage());
        }
    }
}