<?php

namespace App\Http\Controllers;

use App\Models\Pemasukan;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
use App\Mail\PemasukanDiterimaMail;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Carbon;


class PemasukanController extends Controller
{
    public function index(Request $request)
{
    $query = Pemasukan::query();

    // Cek filter waktu
    if ($request->has('filter')) {
        $filter = $request->filter;

        if ($filter === 'hari') {
            $query->whereDate('tanggal', now());
        } elseif ($filter === 'minggu') {
            $query->whereBetween('tanggal', [
                now()->startOfWeek(), now()->endOfWeek()
            ]);
        } elseif ($filter === 'bulan') {
            $query->whereMonth('tanggal', now()->month)
                  ->whereYear('tanggal', now()->year);
        } elseif ($filter === 'tahun') {
            $query->whereYear('tanggal', now()->year);
        }
    }

    // Ambil data sesuai filter + pagination
    $pemasukans = $query->orderBy('tanggal', 'desc')->paginate(10);

    // Ambil semua data hasil filter untuk hitung total
    $allPemasukans = $query->get();

    // Hitung total
    $total = $allPemasukans->reduce(function ($carry, $item) {
        if ($item->kategori === 'uang') {
            return $carry + $item->jumlah;
        } elseif ($item->kategori === 'barang' && $item->quantity && $item->harga) {
            return $carry + ($item->quantity * $item->harga);
        }
        return $carry;
    }, 0);

    return view('transaksi.pemasukan.index', compact('pemasukans', 'total'));
}

    public function accept($id)
{
    $pemasukan = Pemasukan::findOrFail($id);

    if ($pemasukan->status !== 'Diterima') {
        $pemasukan->status = 'Diterima';
        $pemasukan->save();

        // Kirim email setelah simpan
        Mail::to($pemasukan->email)->send(new PemasukanDiterimaMail($pemasukan));

        return redirect()->back()->with('success', 'Sumbangan telah diterima dan email sudah dikirim.');
    }

    return redirect()->back()->with('success', 'Sumbangan sudah diterima sebelumnya.');
}

    public function reject($id)
    {
        $pemasukan = Pemasukan::findOrFail($id);

        if ($pemasukan->status !== 'Ditolak') {
            $pemasukan->status = 'Ditolak';
            $pemasukan->save();
            return Redirect::back()->with('success', 'Sumbangan telah ditolak.');
        }

        return Redirect::back()->with('success', 'Sumbangan sudah ditolak sebelumnya.');
    }
    
    

    public function create()
    {
        return view('transaksi.pemasukan.create');
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'tanggal' => 'required|date',
            'nama' => 'required|string|max:255',
            'kategori' => 'required|in:uang,barang',
            'jumlah' => 'nullable|numeric',
            'harga' => 'nullable|numeric',
            'quantity' => 'nullable|numeric',
            'keterangan' => 'nullable|string|max:255',
            'bukti' => 'nullable|image|mimes:jpeg,png,jpg|max:2048',
        ]);
    
        // Jika kategori barang, hitung jumlah otomatis
        if ($validated['kategori'] === 'barang') {
            $validated['jumlah'] = $validated['harga'] * $validated['quantity'];
        }
    
        if ($request->hasFile('bukti')) {
            $file = $request->file('bukti');
            $filename = time() . '_' . $file->getClientOriginalName();
            $file->storeAs('public/bukti_sumbangan', $filename);
            $validated['bukti'] = $filename;
        }
    
        $validated['status'] = 'Diterima';
    
        Pemasukan::create($validated);
    
        return redirect()->route('pemasukan.index')->with('success', 'Data berhasil ditambahkan.');
    }
    

    public function edit(Pemasukan $pemasukan)
    {
        return view('transaksi.pemasukan.edit', compact('pemasukan'));
    }

    public function update(Request $request, Pemasukan $pemasukan)
    {
        $request->validate([
            'tanggal' => 'required|date',
            'kategori' => 'required|string',
            'nama' => 'required|string|max:255',
            'jumlah' => 'required|numeric',
            'quantity' => 'nullable|numeric',
            'keterangan' => 'nullable|string|max:255',
        ]);

        $data = $request->all();

        if ($request->kategori !== 'barang') {
            $data['quantity'] = null;
        }

        // Tetap simpan keterangan walau kategori bukan barang
        $data['keterangan'] = $data['keterangan'] ?? '';

        $pemasukan->update($data);

        return redirect()->route('pemasukan.index')->with('success', 'Data berhasil diperbarui.');
    }

    public function destroy(Pemasukan $pemasukan)
    {
        $pemasukan->delete();
        return redirect()->route('pemasukan.index')->with('success', 'Data berhasil dihapus.');
    }
}
