<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Transaksi;
use App\Models\Booking;
use App\Models\Finance;
use App\Models\Expense;
use Carbon\Carbon;
use App\Models\PerpanjanganBooking;
use Illuminate\Support\Facades\File;

class TransaksiController extends Controller
{
    public function index(Request $request)
    {
        $query = Transaksi::with('booking.user', 'booking.room');

        if ($request->has('search') && !empty($request->search)) {
            $query->where('status_transaksi', 'like', '%' . $request->search . '%');
        }

        $transaksi = $query->orderBy('tanggal_pembayaran', 'desc')->paginate(10);

        return view('admin.transaksi', compact('transaksi'));
    }

    public function create()
    {
        $bookings = Booking::all();
        return view('admin.createtransaksi', compact('bookings'));
    }

    public function store(Request $request)
    {
        $request->validate([
            'id_booking'         => 'required|exists:booking,id_booking',
            'jumlah_pembayaran'  => 'required|numeric|min:0',
            'metode_pembayaran'  => 'required|in:Transfer,E-Wallet,Tunai',
            'status_transaksi'   => 'required|in:Belum Lunas,Lunas,Refund',
            'bukti_pembayaran'   => 'nullable|image|mimes:jpeg,png,jpg|max:2048',
            'tanggal_pembayaran' => 'required|date',
        ]);

        $filePath = null;
        if ($request->hasFile('bukti_pembayaran')) {
            $file = $request->file('bukti_pembayaran');
            $filename = time() . '_' . $file->getClientOriginalName();
            $file->move(public_path('assets/admin'), $filename);
            $filePath = 'assets/admin/' . $filename;
        }

        Transaksi::create([
            'id_booking'         => $request->id_booking,
            'jumlah_pembayaran'  => $request->jumlah_pembayaran,
            'metode_pembayaran'  => $request->metode_pembayaran,
            'status_transaksi'   => $request->status_transaksi,
            'bukti_pembayaran'   => $filePath,
            'tanggal_pembayaran' => $request->tanggal_pembayaran,
        ]);

        $this->updateFinance();

        return redirect()->route('admin.transaksi')->with('success', 'Transaksi berhasil ditambahkan.');
    }

    public function edit($id_transaksi)
    {
        $transaksi = Transaksi::findOrFail($id_transaksi);
        $bookings = Booking::all();
        return view('admin.edittransaksi', compact('transaksi', 'bookings'));
    }

    public function update(Request $request, $id_transaksi)
    {
        $request->validate([
            'id_booking'         => 'required|exists:booking,id_booking',
            'jumlah_pembayaran'  => 'required|numeric|min:0',
            'metode_pembayaran'  => 'required|in:Transfer,E-Wallet,Tunai',
            'status_transaksi'   => 'required|in:Belum Lunas,Lunas,Refund',
            'bukti_pembayaran'   => 'nullable|image|mimes:jpeg,png,jpg|max:2048',
            'tanggal_pembayaran' => 'required|date',
        ]);

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

        if ($request->hasFile('bukti_pembayaran')) {
            if ($transaksi->bukti_pembayaran && File::exists(public_path($transaksi->bukti_pembayaran))) {
                File::delete(public_path($transaksi->bukti_pembayaran));
            }

            $file = $request->file('bukti_pembayaran');
            $filename = time() . '_' . $file->getClientOriginalName();
            $file->move(public_path('assets/admin'), $filename);
            $transaksi->bukti_pembayaran = 'assets/admin/' . $filename;
        }

        $transaksi->update([
            'id_booking'         => $request->id_booking,
            'jumlah_pembayaran'  => $request->jumlah_pembayaran,
            'metode_pembayaran'  => $request->metode_pembayaran,
            'status_transaksi'   => $request->status_transaksi,
            'tanggal_pembayaran' => $request->tanggal_pembayaran,
        ]);

        return redirect()->route('admin.transaksi')->with('success', 'Transaksi berhasil diperbarui.');
    }

    public function destroy($id_transaksi)
    {
        $transaksi = Transaksi::findOrFail($id_transaksi);

        if ($transaksi->bukti_pembayaran && File::exists(public_path($transaksi->bukti_pembayaran))) {
            File::delete(public_path($transaksi->bukti_pembayaran));
        }

        $transaksi->delete();

        return redirect()->route('admin.transaksi')->with('success', 'Transaksi berhasil dihapus.');
    }

    /**
     * Fungsi bantu untuk memperbarui data keuangan setelah transaksi disimpan.
     */
    private function updateFinance()
    {
        $totalPemasukan   = Transaksi::sum('jumlah_pembayaran');
        $totalPengeluaran = Expense::sum('jumlah_pengeluaran');
        $totalKeuntungan  = $totalPemasukan - $totalPengeluaran;

        Finance::create([
            'tanggal'     => now()->format('Y-m-d'),
            'pemasukan'   => $totalPemasukan,
            'pengeluaran' => $totalPengeluaran,
            'keuntungan'  => $totalKeuntungan,
            'keterangan'  => 'Update otomatis dari transaksi baru'
        ]);
    }

    public function perpanjang(Request $request, $id_booking)
{
    $booking = Booking::with('room')->findOrFail($id_booking);

    $request->validate([
        'tanggal_checkout_baru' => 'required|date|after:' . $booking->tanggal_checkout,
        'metode_pembayaran' => 'required|string',
        'bukti_pembayaran' => 'required|image|max:2048',
    ]);

    // Upload bukti pembayaran
    $file = $request->file('bukti_pembayaran');
    $filename = time() . '_' . $file->getClientOriginalName();
    $file->move(public_path('assets/users/'), $filename);

    // Hitung selisih bulan
    $oldDate = Carbon::parse($booking->tanggal_checkout);
    $newDate = Carbon::parse($request->tanggal_checkout_baru);
    $selisih_bulan = $oldDate->diffInMonths($newDate);

    // Hitung total biaya
    $harga_per_bulan = $booking->room->harga;
    $total = $selisih_bulan * $harga_per_bulan;

    // Simpan ke tabel transaksi (misalnya)
    Transaksi::create([
        'id_booking' => $id_booking,
        'tanggal_transaksi' => now(),
        'tanggal_checkout_lama' => $booking->tanggal_checkout,
        'tanggal_checkout_baru' => $request->tanggal_checkout_baru,
        'metode_pembayaran' => $request->metode_pembayaran,
        'bukti_pembayaran' => 'assets/users/' . $filename,
        'total_biaya' => $total,
        'status_transaksi' => 'Lunas',
    ]);

    // Update status booking jadi pending (konfirmasi admin)
    $booking->update([
        'status_booking' => 'Pending'
    ]);

    return redirect('/petakos')->with('success', 'Permintaan perpanjangan berhasil diajukan.');
}

   // Fungsi untuk menampilkan form perpanjangan
   public function formPerpanjang($id_booking)
   {
       // Ambil data booking beserta relasi room dan user
    $booking = Booking::with(['room', 'user'])->findOrFail($id_booking);

       // Mengembalikan tampilan form perpanjangan sewa
       return view('users.perpanjangan-sewa', compact('booking'));
   }

   // Fungsi untuk memproses permintaan perpanjangan sewa
   public function prosesPerpanjang(Request $request, $id_booking)
{
    $request->validate([
        'durasi_bulan' => 'required|integer|min:1',
        'metode_pembayaran' => 'required',
        'bukti_pembayaran' => 'required|image|max:2048',
    ]);

    $booking = Booking::with('room')->findOrFail($id_booking);

    // Hitung tanggal baru
    $tanggal_checkout_lama = $booking->tanggal_checkout;
    $tanggal_checkout_baru = Carbon::parse($tanggal_checkout_lama)->addMonths($request->durasi_bulan);

    // Hitung total biaya
    $harga_per_bulan = $booking->room->harga;
    $total_biaya = $request->durasi_bulan * $harga_per_bulan;

    // Upload bukti pembayaran ke public/assets/users/
    $file = $request->file('bukti_pembayaran');
    $filename = time() . '_' . $file->getClientOriginalName();
    $file->move(public_path('assets/users/'), $filename);
    $buktiPath = 'assets/users/' . $filename;

    // Simpan data perpanjangan
    PerpanjanganBooking::create([
        'id_booking' => $booking->id_booking,
        'tanggal_checkout_lama' => $tanggal_checkout_lama,
        'tanggal_checkout_baru' => $tanggal_checkout_baru,
        'durasi_bulan' => $request->durasi_bulan,
        'metode_pembayaran' => $request->metode_pembayaran,
        'bukti_pembayaran' => $buktiPath,
        'total_biaya' => $total_biaya,
        'tanggal_pengajuan' => now(),
        'status' => 'Pending',
    ]);

    // Buat transaksi baru
    Transaksi::create([
        'id_booking' => $booking->id_booking,
        'jumlah_pembayaran' => $total_biaya,
        'metode_pembayaran' => $request->metode_pembayaran,
        'status_transaksi' => 'Lunas',
        'bukti_pembayaran' => $buktiPath,
        'tanggal_pembayaran' => now(),
    ]);

    // Update data di tabel booking
    $booking->update([
        'tanggal_checkout' => $tanggal_checkout_baru,
        'status_booking' => 'Pending',
    ]);

    return redirect()->route('users.peta')->with('success', 'Permintaan perpanjangan berhasil diajukan!');
}

}