<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Expense;
use App\Models\Transaksi;
use App\Models\Finance;

class ExpenseController extends Controller
{
    /**
     * Menampilkan daftar pengeluaran.
     */
    public function index(Request $request)
    {
        $query = Expense::query();

        if ($request->has('search')) {
            $search = $request->search;
            $query->where('keterangan', 'LIKE', "%$search%")
                  ->orWhere('jumlah_pengeluaran', 'LIKE', "%$search%")
                  ->orWhere('tanggal_pengeluaran', 'LIKE', "%$search%");
        }

        // Mengambil semua data pengeluaran
        $pengeluaran = $query->orderBy('tanggal_pengeluaran', 'desc')->get();

        return view('admin.expense', compact('pengeluaran'));
    }

    /**
     * Menampilkan form untuk menambahkan pengeluaran baru.
     */
    public function create()
    {
        return view('admin.createexpense');
    }

    /**
     * Menyimpan data pengeluaran baru ke database.
     */
    public function store(Request $request)
    {
        $request->validate([
            'keterangan'         => 'required|string|max:255',
            'jumlah_pengeluaran' => 'required|numeric|min:0',
            'tanggal_pengeluaran'=> 'required|date',
        ]);

        Expense::create($request->only(['keterangan', 'jumlah_pengeluaran', 'tanggal_pengeluaran']));

        // Update data keuangan
        $this->updateFinance();

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

    /**
     * Menampilkan form untuk mengedit pengeluaran.
     */
    public function edit($id_pengeluaran)
    {
        $pengeluaran = Expense::findOrFail($id_pengeluaran);
        return view('admin.editexpense', compact('pengeluaran'));
    }

    /**
     * Memperbarui data pengeluaran di database.
     */
    public function update(Request $request, $id_pengeluaran)
    {
        $request->validate([
            'keterangan'         => 'required|string|max:255',
            'jumlah_pengeluaran' => 'required|numeric|min:0',
            'tanggal_pengeluaran'=> 'required|date',
        ]);

        $pengeluaran = Expense::findOrFail($id_pengeluaran);
        $pengeluaran->update($request->only(['keterangan', 'jumlah_pengeluaran', 'tanggal_pengeluaran']));

        // Update data keuangan
        $this->updateFinance();

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

    /**
     * Menghapus data pengeluaran dari database.
     */
    public function destroy($id_pengeluaran)
    {
        $pengeluaran = Expense::findOrFail($id_pengeluaran);
        $pengeluaran->delete();

        // Update data keuangan
        $this->updateFinance();

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

    /**
     * Fungsi untuk memperbarui data keuangan di tabel Finance.
     */
    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 data pengeluaran'
        ]);
    }
}
