<?php

namespace App\Http\Controllers;

use App\Models\Angsuran;
use App\Models\AngsuranDetail;
use App\Models\Kampus;
use App\Models\Prodi;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class ValidasiPembayaranController extends Controller
{
    // LIST menunggu validasi dengan filter
    public function index(Request $request)
    {
        $query = AngsuranDetail::where('pembayaran_valid', 'pending')
            ->where('dibayar', '>', 0)
            ->with(['angsuran.mahasiswa', 'angsuran.mahasiswa.prodi', 'angsuran.mahasiswa.prodi.kampus']);

        // Filter berdasarkan pencarian
        if ($request->has('search') && $request->search != '') {
            $search = $request->search;
            $query->whereHas('angsuran.mahasiswa', function ($q) use ($search) {
                $q->where('nama', 'like', "%{$search}%")
                    ->orWhere('nim', 'like', "%{$search}%")
                    ->orWhereHas('prodi', function ($q2) use ($search) {
                        $q2->where('nama', 'like', "%{$search}%");
                    });
            });
        }

        // Filter berdasarkan kampus
        if ($request->has('kampus') && $request->kampus != '') {
            $query->whereHas('angsuran.mahasiswa.prodi.kampus', function ($q) use ($request) {
                $q->where('id', $request->kampus);
            });
        }

        // Filter berdasarkan prodi
        if ($request->has('prodi') && $request->prodi != '') {
            $query->whereHas('angsuran.mahasiswa.prodi', function ($q) use ($request) {
                $q->where('id', $request->prodi);
            });
        }

        // Filter berdasarkan tanggal
        if ($request->has('tanggal_mulai') && $request->tanggal_mulai != '') {
            $query->whereDate('tanggal_bayar', '>=', $request->tanggal_mulai);
        }

        if ($request->has('tanggal_selesai') && $request->tanggal_selesai != '') {
            $query->whereDate('tanggal_bayar', '<=', $request->tanggal_selesai);
        }

        // Filter berdasarkan jumlah pembayaran
        if ($request->has('jumlah_min') && $request->jumlah_min != '') {
            $query->where('dibayar', '>=', $request->jumlah_min);
        }

        if ($request->has('jumlah_max') && $request->jumlah_max != '') {
            $query->where('dibayar', '<=', $request->jumlah_max);
        }

        $data = $query->orderBy('created_at', 'desc')->get();

        // Get filter data for dropdowns
        $kampusList = Kampus::all();

        // Get prodi list based on selected kampus
        $prodiList = [];
        if ($request->has('kampus') && $request->kampus != '') {
            $prodiList = Prodi::where('kampus_id', $request->kampus)->get();
        } else {
            $prodiList = Prodi::all();
        }

        return view('validasi.pembayaran', compact('data', 'kampusList', 'prodiList'));
    }

    // GET PRODI BY KAMPUS (AJAX)
    public function getProdiByKampus($kampus_id)
    {
        try {
            $prodiList = Prodi::where('kampus_id', $kampus_id)->get();

            return response()->json([
                'success' => true,
                'prodi' => $prodiList
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Gagal mengambil data prodi'
            ], 500);
        }
    }

    // BULK SETUJUI PEMBAYARAN (by selected pembayaran IDs)
    public function bulkSetujui(Request $request)
    {
        try {
            $request->validate([
                'selected_pembayaran' => 'required|array',
                'selected_pembayaran.*' => 'exists:angsuran_detail,id'
            ]);

            $selectedPembayaran = $request->selected_pembayaran;
            $count = count($selectedPembayaran);

            foreach ($selectedPembayaran as $pembayaranId) {
                $detail = AngsuranDetail::findOrFail($pembayaranId);

                $detail->update([
                    'pembayaran_valid' => 'valid',
                    'pembayaran_valid_at' => now(),
                    'pembayaran_valid_by' => Auth::id(),
                ]);

                // Update status angsuran
                $angsuran = Angsuran::find($detail->angsuran_id);
                if ($angsuran) {
                    $this->updateAngsuranStatus($angsuran);
                }
            }

            if ($request->ajax() || $request->wantsJson()) {
                return response()->json([
                    'success' => true,
                    'message' => $count . ' pembayaran berhasil disetujui!'
                ]);
            }

            return redirect()->route('validasi.pembayaran.index')->with('success', $count . ' pembayaran berhasil disetujui!');

        } catch (\Exception $e) {
            \Log::error('Error in bulkSetujui: ' . $e->getMessage());

            if ($request->ajax() || $request->wantsJson()) {
                return response()->json([
                    'success' => false,
                    'message' => 'Gagal menyetujui pembayaran: ' . $e->getMessage()
                ], 500);
            }

            return redirect()->route('validasi.pembayaran.index')->with('error', 'Gagal menyetujui pembayaran: ' . $e->getMessage());
        }
    }

    // BULK TOLAK PEMBAYARAN (by selected pembayaran IDs)
    public function bulkTolak(Request $request)
    {
        try {
            $request->validate([
                'selected_pembayaran' => 'required|array',
                'selected_pembayaran.*' => 'exists:angsuran_detail,id'
            ]);

            $selectedPembayaran = $request->selected_pembayaran;
            $count = count($selectedPembayaran);

            foreach ($selectedPembayaran as $pembayaranId) {
                $detail = AngsuranDetail::findOrFail($pembayaranId);

                $detail->update([
                    'dibayar' => 0,
                    'sisa' => $detail->total,
                    'tanggal_bayar' => null,
                    'pembayaran_valid' => 'pending',
                    'pembayaran_valid_at' => null,
                    'pembayaran_valid_by' => null,
                ]);

                // Update status angsuran
                $angsuran = Angsuran::find($detail->angsuran_id);
                if ($angsuran) {
                    $this->updateAngsuranStatus($angsuran);
                }
            }

            if ($request->ajax() || $request->wantsJson()) {
                return response()->json([
                    'success' => true,
                    'message' => $count . ' pembayaran berhasil ditolak!'
                ]);
            }

            return redirect()->route('validasi.pembayaran.index')->with('success', $count . ' pembayaran berhasil ditolak!');

        } catch (\Exception $e) {
            \Log::error('Error in bulkTolak: ' . $e->getMessage());

            if ($request->ajax() || $request->wantsJson()) {
                return response()->json([
                    'success' => false,
                    'message' => 'Gagal menolak pembayaran: ' . $e->getMessage()
                ], 500);
            }

            return redirect()->route('validasi.pembayaran.index')->with('error', 'Gagal menolak pembayaran: ' . $e->getMessage());
        }
    }

    // SETUJUI PEMBAYARAN (single)
    public function setujui($id)
    {
        $detail = AngsuranDetail::findOrFail($id);

        $detail->update([
            'pembayaran_valid' => 'valid',
            'pembayaran_valid_at' => now(),
            'pembayaran_valid_by' => Auth::id(),
        ]);

        $angsuran = Angsuran::find($detail->angsuran_id);
        if ($angsuran) {
            $this->updateAngsuranStatus($angsuran);
        }

        return redirect()->route('validasi.pembayaran.index')->with('success', 'Pembayaran berhasil divalidasi!');
    }

    // TOLAK PEMBAYARAN (single)
    public function tolak($id)
    {
        $detail = AngsuranDetail::findOrFail($id);

        $detail->update([
            'dibayar' => 0,
            'sisa' => $detail->total,
            'tanggal_bayar' => null,
            'pembayaran_valid' => 'pending',
            'pembayaran_valid_at' => null,
            'pembayaran_valid_by' => null,
        ]);

        $angsuran = Angsuran::find($detail->angsuran_id);
        if ($angsuran) {
            $this->updateAngsuranStatus($angsuran);
        }

        return redirect()->route('validasi.pembayaran.index')->with('success', 'Pembayaran telah ditolak dan dikembalikan ke status awal!');
    }

    // Fungsi helper untuk update status angsuran
    private function updateAngsuranStatus($angsuran)
    {
        $totalSisa = $angsuran->details->sum('sisa');
        $totalDibayar = $angsuran->details->sum('dibayar');

        if ($totalSisa <= 0) {
            $statusPembayaran = 'lunas';
        } elseif ($totalDibayar > 0) {
            $statusPembayaran = 'proses';
        } else {
            $statusPembayaran = 'belum dibayar';
        }

        $angsuran->update([
            'sisa' => $totalSisa,
            'status_pembayaran' => $statusPembayaran,
        ]);
    }
}
