<?php

namespace App\Http\Controllers;

use App\Models\Barang;
use App\Models\Transaksi;
use App\Models\DetailTransaksi;
use App\Models\Pelanggan;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class TransaksiController extends Controller
{
    // Memproses simulasi checkout barang sembako langsung
    public function checkoutSederhana(Request $request)
    {
        if (!session()->has('pelanggan_id')) {
            return redirect('/login')->withErrors(['email' => 'Silakan login terlebih dahulu untuk bertransaksi.']);
        }

        $barangId = $request->input('barang_id');
        $kodeKupon = $request->input('kode_kupon');
        $qty = 1;

        $barang = Barang::findOrFail($barangId);
        $subtotal = $barang->harga * $qty;

        $promoId = null;
        $potonganHarga = 0;

        // 🎯 PERBAIKAN EMAS: CEK VALIDASI KUPON (ANTI HURUF BESAR/KECIL)
        if (!empty($kodeKupon)) {
            // Kita paksa query mencari dengan huruf besar semua biar singkron
            $promo = \App\Models\Promo::where(DB::raw('UPPER(kode_kupon)'), strtoupper($kodeKupon))
                ->where('status', 'aktif')
                ->first();

            if ($promo) {
                // Cek apakah syarat minimal belanja terpenuhi
                if ($subtotal >= $promo->minimal_belanja) {
                    $promoId = $promo->id;
                    $potonganHarga = $promo->potongan_harga;
                } else {
                    return back()->withErrors(['kupon_error' => 'Gagal klaim! Minimal belanja untuk kupon ini adalah Rp ' . number_format($promo->minimal_belanja, 0, ',', '.')]);
                }
            } else {
                return back()->withErrors(['kupon_error' => 'Maaf, kode kupon promo tidak valid, salah ketik, atau sudah kedaluwarsa.']);
            }
        }

        $totalBayar = $subtotal - $potonganHarga;
        if ($totalBayar < 0) $totalBayar = 0;

        $transaksi = Transaksi::create([
            'pelanggan_id' => session('pelanggan_id'),
            'promo_id' => $promoId,
            'total_bayar' => $totalBayar,
            'bukti_transfer' => null,
            'status' => 'menunggu',
            'no_resi' => null,
        ]);

        DetailTransaksi::create([
            'transaksi_id' => $transaksi->id,
            'barang_id' => $barang->id,
            'qty' => $qty,
            'subtotal' => $subtotal,
        ]);

        $barang->decrement('stok', $qty);

        $poinBaru = floor($totalBayar / 10000);
        $pelanggan = Pelanggan::find(session('pelanggan_id'));
        $pelanggan->increment('poin_loyalitas', $poinBaru);

        return redirect('/nota/' . $transaksi->id)->with('success', 'Pesanan berhasil dibuat! Kupon berhasil digunakan. Anda mendapatkan bonus +' . $poinBaru . ' Poin Loyalitas.');
    }

    // Menampilkan halaman Halaman Pelacakan Status Paket Pelanggan (SINKRONISASI CRM TAB)
    public function lacakPaket(Request $request)
    {
        if (!session()->has('pelanggan_id')) {
            return redirect('/login');
        }

        $statusFilter = $request->get('status', 'semua');
        $query = Transaksi::with(['detailTransaksis.barang', 'logStatuses'])
            ->where('pelanggan_id', session('pelanggan_id'));

        // Logika Sinkronisasi Tab: Menggabungkan status 'proses' dan 'dikirim' ke tab yang sama
        if ($statusFilter == 'menunggu') {
            $query->where('status', 'menunggu');
        } elseif ($statusFilter == 'proses') {
            $query->whereIn('status', ['proses', 'dikirim']);
        } elseif ($statusFilter == 'selesai') {
            $query->where('status', 'selesai');
        } elseif ($statusFilter == 'ditolak') {
            $query->where('status', 'ditolak');
        }

        $transaksis = $query->latest()->get();

        // Mengatur tampilan timeline sebelah kanan jika ada item yang di-klik pelacakannya
        $lacakId = $request->get('lacak_id');
        $transaksiTerpilih = null;
        $logs = collect();

        if ($lacakId) {
            $transaksiTerpilih = Transaksi::find($lacakId);
            if ($transaksiTerpilih) {
                $logs = DB::table('log_statuses')
                    ->where('transaksi_id', $lacakId)
                    ->orderBy('created_at', 'desc')
                    ->get();
            }
        }

        return view('lacak_pesanan', compact('transaksis', 'statusFilter', 'transaksiTerpilih', 'logs'));
    }

    // Menampilkan halaman Nota Detail & Form Upload Struk
    public function detailNota($id)
    {
        $transaksi = Transaksi::with(['detailTransaksis.barang', 'logStatuses', 'pelanggan'])->findOrFail($id);
        return view('nota_detail', compact('transaksi'));
    }

    // Memproses Upload Struk Bukti Transfer ke Database
    public function uploadStruk(Request $request, $id)
    {
        $request->validate([
            'bukti_transfer' => 'required|image|mimes:jpeg,png,jpg|max:2048',
        ]);

        $transaksi = Transaksi::findOrFail($id);
        $namaFile = 'struk_' . time() . '.' . $request->file('bukti_transfer')->getClientOriginalExtension();
        $request->file('bukti_transfer')->move(public_path('images'), $namaFile);

        $transaksi->update([
            'bukti_transfer' => $namaFile,
            'status' => 'menunggu'
        ]);

        return back()->with('success', 'Struk transfer berhasil diunggah! Menunggu konfirmasi dari Admin Toko.');
    }

    // Memproses Konfirmasi Sembako Diterima oleh Pelanggan (FIXED LOGIC)
    public function konfirmasiSelesai($id)
    {
        if (!session()->has('pelanggan_id')) {
            return redirect('/login');
        }

        $transaksi = Transaksi::findOrFail($id);

        // KUNCI PERBAIKAN: Izinkan konfirmasi jika status bernilai 'proses' ATAU 'dikirim'
        if ($transaksi->status == 'proses' || $transaksi->status == 'dikirim') {
            $transaksi->update([
                'status' => 'selesai'
            ]);

            // Catat rekam jejak final ke histori log
            DB::table('log_statuses')->insert([
                'transaksi_id' => $transaksi->id,
                'status' => 'Selesai',
                'keterangan' => 'Komoditas sembako telah diterima dengan aman dan dikonfirmasi langsung oleh pelanggan.',
                'created_at' => now(),
                'updated_at' => now(),
            ]);

            return redirect()->back()->with('success', 'Terima kasih atas konfirmasinya! Pesanan sembako Anda resmi dinyatakan Selesai.');
        }

        return redirect()->back()->withErrors(['error' => 'Transaksi tidak dapat dikonfirmasi dalam status ini.']);
    }

    /**
     * Relasi ke model Kupon (CRM Voucher)
     * Menghubungkan kolom promo_id di tabel transaksis dengan id di tabel kupons
     */
    public function kupon()
    {
        return $this->belongsTo(\App\Models\Kupon::class, 'promo_id');
    }
}
