<?php

namespace App\Http\Controllers;

use App\Models\Mahasiswa;
use App\Models\Kampus;
use App\Models\Angsuran;
use App\Models\AngsuranDetail;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class TambahBiayaController extends Controller
{
    /**
     * Tampilan Tambah Biaya untuk Mahasiswa
     */
    public function index(Request $request)
    {
        $user = Auth::user();
        $isGlobal = $user->role === 'superadmin' || $user->role_id === 1;

        $filters = $request->only(['kampus_id', 'search']);
        $perPage = $request->input('per_page', 10);

        $query = Mahasiswa::query()
            ->select('mahasiswa.id', 'mahasiswa.nim', 'mahasiswa.nama', 'mahasiswa.kampus_id', 'mahasiswa.prodi_id', 'mahasiswa.angkatan', 'mahasiswa.validasi_status')
            ->with([
                'kampus:id,nama,singkatan',
                'prodi:id,nama,kode,jenjang'
            ])
            ->where('validasi_status', 'valid')
            ->withExists([
                'angsuran as has_angsuran' => function ($q) {
                    $q->where('status_rencana', 'valid');
                }
            ]);

        if (!$isGlobal && $user->kampus_id) {
            $query->where('kampus_id', $user->kampus_id);
        } elseif ($request->kampus_id && $request->kampus_id !== '' && $request->kampus_id !== 'all') {
            $query->where('kampus_id', $request->kampus_id);
        }

        if ($request->search) {
            $query->where(function ($q) use ($request) {
                $q->where('nama', 'like', "%{$request->search}%")
                    ->orWhere('nim', 'like', "%{$request->search}%");
            });
        }

        $mahasiswa = $query->orderBy('nim', 'asc')->paginate($perPage)->withQueryString();
        $kampusList = $isGlobal ? Kampus::select('id', 'nama', 'singkatan')->get() : [];

        return view('tambah-biaya.index', compact('mahasiswa', 'kampusList', 'filters', 'isGlobal'));
    }

    public function inject(Request $request)
{
    $user = Auth::user();

    $request->validate([
        'mahasiswa_ids' => 'required|array|min:1',
        'mahasiswa_ids.*' => 'exists:mahasiswa,id',
        'biaya_items' => 'required|array|min:1',
        'biaya_items.*.nama' => 'required|string|max:100',
        'biaya_items.*.kategori' => 'required|in:BL,SP,RUTIN',
        'biaya_items.*.nominal' => 'required|numeric|min:0',
        'biaya_items.*.semester' => 'required|array|min:1',
        'biaya_items.*.semester.*' => 'integer|min:1|max:14',
        // 🔧 PERUBAHAN: tanggal sekarang bisa array per semester
        'biaya_items.*.tanggal' => 'required|array|min:1',
        'biaya_items.*.tanggal.*' => 'date',
    ]);

    $successCount = 0;
    $skippedCount = 0;
    $errorCount = 0;
    $errors = [];
    $totalItems = 0;
    $totalNominal = 0;

    DB::beginTransaction();

    try {
        $currentTime = now();

        foreach ($request->mahasiswa_ids as $mahasiswaId) {
            $mhs = Mahasiswa::find($mahasiswaId);

            if (!$mhs) {
                $errorCount++;
                $errors[] = "Mahasiswa ID {$mahasiswaId} tidak ditemukan";
                continue;
            }

            if ($mhs->validasi_status !== 'valid') {
                $errorCount++;
                $errors[] = "Mahasiswa {$mhs->nama} (NIM: {$mhs->nim}) - Status mahasiswa belum valid";
                continue;
            }

            $angsuran = Angsuran::where('mahasiswa_id', $mahasiswaId)
                ->where('status_rencana', 'valid')
                ->first();

            if (!$angsuran) {
                $errorCount++;
                $errors[] = "Mahasiswa {$mhs->nama} (NIM: {$mhs->nim}) - Belum memiliki rencana angsuran yang valid";
                continue;
            }

            foreach ($request->biaya_items as $itemIndex => $item) {
                $namaBiaya = $item['nama'];
                $kategori = $item['kategori'];
                $semesterList = $item['semester'];
                $nominal = $item['nominal'];
                // 🔧 PERUBAHAN: tanggal sekarang array, sesuaikan dengan semester
                $tanggalList = $item['tanggal'];

                $namaSingkat = strtoupper(preg_replace('/[^A-Za-z0-9]/', '', $namaBiaya));
                $namaSingkat = substr($namaSingkat, 0, 20);

                // Loop semester dengan index untuk mengambil tanggal sesuai semester
                foreach ($semesterList as $idx => $semester) {
                    // 🔧 PERUBAHAN: ambil tanggal sesuai index atau pakai tanggal pertama jika tidak ada
                    $tanggalTagihan = isset($tanggalList[$idx]) ? $tanggalList[$idx] : ($tanggalList[0] ?? date('Y-m-d'));

                    $kodeUnik = "{$kategori}-S{$semester}-{$namaSingkat}";

                    $exists = AngsuranDetail::where('angsuran_id', $angsuran->id)
                        ->where('kode_biaya', $kodeUnik)
                        ->where('semester', $semester)
                        ->where('tanggal_angsuran', $tanggalTagihan)
                        ->exists();

                    if ($exists) {
                        $skippedCount++;
                        continue;
                    }

                    $komponen = $namaBiaya . ' (Semester ' . $semester . ')';

                    AngsuranDetail::create([
                        'angsuran_id' => $angsuran->id,
                        'biaya_master_id' => null,
                        'kode_biaya' => $kodeUnik,
                        'komponen' => $komponen,
                        'semester' => $semester,
                        'total' => $nominal,
                        'total_asli' => null,
                        'potongan' => 0,
                        'dibayar' => 0,
                        'sisa' => $nominal,
                        'tanggal_angsuran' => $tanggalTagihan,
                        'rencana_valid' => 'valid',
                        'rencana_valid_at' => $currentTime,
                        'rencana_valid_by' => $user->id,
                        'pembayaran_valid' => 'pending',
                        'created_at' => $currentTime,
                        'updated_at' => $currentTime,
                    ]);

                    $successCount++;
                    $totalItems++;
                    $totalNominal += $nominal;
                }
            }

            $angsuran->total = $angsuran->details()->sum('total');
            $angsuran->sisa = $angsuran->details()->sum('sisa');
            $angsuran->save();
        }

        DB::commit();

    } catch (\Exception $e) {
        DB::rollBack();
        Log::error('Bulk inject transaction error: ' . $e->getMessage());
        return redirect()->back()->with('error', 'Terjadi kesalahan sistem: ' . $e->getMessage());
    }

    $message = "Berhasil menambahkan {$totalItems} item biaya dengan total Rp " . number_format($totalNominal, 0, ',', '.');
    if ($skippedCount > 0)
        $message .= " | {$skippedCount} item dilewati (sudah ada)";
    if ($errorCount > 0)
        $message .= " | {$errorCount} mahasiswa gagal";

    if ($errorCount > 0 && !empty($errors)) {
        session()->flash('inject_errors', $errors);
    }

    $status = $errorCount > 0 ? 'warning' : 'success';
    return redirect()->back()->with($status, $message);
}

    /**
     * Get angsuran detail for a mahasiswa.
     */
    public function getDetail($id)
    {
        try {
            $angsuran = Angsuran::with(['details', 'mahasiswa'])
                ->where('mahasiswa_id', $id)
                ->where('status_rencana', 'valid')
                ->first();

            if (!$angsuran) {
                return response()->json([
                    'error' => 'Tidak ditemukan rencana angsuran yang valid untuk mahasiswa ini'
                ], 404);
            }

            return response()->json([
                'mahasiswa' => [
                    'nama' => $angsuran->mahasiswa->nama,
                    'nim' => $angsuran->mahasiswa->nim,
                ],
                'total' => $angsuran->total,
                'sisa' => $angsuran->sisa,
                'details' => $angsuran->details->map(function ($detail) {
                    $status = 'aktif';
                    if ($detail->sisa <= 0) {
                        $status = 'lunas';
                    } elseif ($detail->dibayar > 0) {
                        $status = 'cicil';
                    }

                    $jenis = 'LAINNYA';
                    $nomorCicilan = 0;
                    $semesterDetail = $detail->semester;
                    $kode = $detail->kode_biaya;

                    if (preg_match('/^SPB_(\d+)$/', $kode, $matches)) {
                        $jenis = 'SPB';
                        $nomorCicilan = (int) $matches[1];
                    } elseif (preg_match('/^SPP(\d+)_(\d+)$/', $kode, $matches)) {
                        $jenis = 'SPP';
                        $nomorCicilan = (int) $matches[1];
                        $semesterDetail = (int) $matches[2];
                    } elseif (preg_match('/^UKT(\d+)_(\d+)$/', $kode, $matches)) {
                        $jenis = 'UKT';
                        $nomorCicilan = (int) $matches[1];
                        $semesterDetail = (int) $matches[2];
                    } elseif (strpos($kode, 'BL-') === 0)
                        $jenis = 'BL';
                    elseif (strpos($kode, 'SP-') === 0)
                        $jenis = 'SP';
                    elseif (strpos($kode, 'RUTIN-') === 0)
                        $jenis = 'RUTIN';

                    $persenPotongan = 0;
                    if ($detail->total_asli && $detail->total_asli > 0) {
                        $persenPotongan = round(($detail->potongan / $detail->total_asli) * 100, 2);
                    }

                    return [
                        'id' => $detail->id,
                        'kode_biaya' => $detail->kode_biaya,
                        'komponen' => $detail->komponen,
                        'jenis' => $jenis,
                        'nomor_cicilan' => $nomorCicilan,
                        'semester' => $semesterDetail,
                        'total_asli' => $detail->total_asli ?? $detail->total,
                        'potongan' => $detail->potongan ?? 0,
                        'persen_potongan' => $persenPotongan,
                        'total' => $detail->total,
                        'dibayar' => $detail->dibayar,
                        'sisa' => $detail->sisa,
                        'tanggal' => $detail->tanggal_angsuran,
                        'status' => $status,
                    ];
                }),
            ]);

        } catch (\Exception $e) {
            Log::error('Get detail error: ' . $e->getMessage());
            return response()->json([
                'error' => 'Gagal memuat data: ' . $e->getMessage()
            ], 500);
        }
    }

    public function getSummary(Request $request)
    {
        $request->validate([
            'ids' => 'required|array',
            'ids.*' => 'exists:mahasiswa,id'
        ]);

        $mahasiswa = Mahasiswa::whereIn('id', $request->ids)
            ->with([
                'angsuran' => function ($q) {
                    $q->where('status_rencana', 'valid');
                }
            ])
            ->get();

        return response()->json([
            'total' => $mahasiswa->count(),
            'with_angsuran' => $mahasiswa->filter(fn($m) => $m->angsuran->isNotEmpty())->count(),
            'without_angsuran' => $mahasiswa->filter(fn($m) => $m->angsuran->isEmpty())->count(),
        ]);
    }
}
