<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\Admin\Tsispindah;
use App\Models\Datmas\Siswa;
use App\Models\Spp\Tsalpenrut;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException;

class MobilePindahSekolahController extends Controller
{
    /**
     * GET /v1/mobile/pindah-sekolah
     * Ambil status pengajuan pindah sekolah aktif + status tagihan siswa.
     */
    public function show(Request $request): JsonResponse
    {
        /** @var Siswa|null $siswa */
        $siswa = $request->attributes->get('auth_siswa');

        if (!$siswa) {
            return response()->json([
                'success' => false,
                'message' => 'Data siswa tidak ditemukan.',
            ], 404);
        }

        // Ambil tagihan aktif up to bulan berjalan
        $now = now();
        $tagihanList = Tsalpenrut::query()
            ->where('idsis', $siswa->id)
            ->whereIn('sta', [0, 1])
            ->where(function ($query) use ($now) {
                $query->where('tah', '<', $now->year)
                    ->orWhere(function ($query) use ($now) {
                        $query->where('tah', $now->year)
                            ->where('bulid', '<=', $now->month);
                    });
            })
            ->orderBy('tah', 'desc')
            ->orderBy('bulid')
            ->orderBy('id')
            ->get();

        $totalTagihan = max(0, $tagihanList->sum('jumlah'));

        // Ambil pengajuan pindah sekolah terbaru
        $pindah = Tsispindah::where('idsis', $siswa->id)
            ->latest()
            ->first();

        // Ambil semua riwayat pengajuan pindah sekolah
        $riwayat = Tsispindah::where('idsis', $siswa->id)
            ->latest()
            ->get();

        return response()->json([
            'success' => true,
            'message' => 'Data berhasil diambil.',
            'data'    => [
                'tagihan_lunas'  => $totalTagihan <= 0,
                'total_tagihan'  => $totalTagihan,
                'tagihan_detail' => collect($tagihanList)->map(fn ($t) => [
                    'bulan'  => $t['bulan']  ?? null,
                    'ket'    => $t['ket']    ?? null,
                    'jumlah' => (double) ($t['jumlah'] ?? 0),
                ])->values()->all(),
                'pindah'         => $pindah ? $this->transformPindah($pindah) : null,
                'riwayat'        => $riwayat->map(fn ($r) => $this->transformPindah($r))->values()->all(),
            ],
        ]);
    }

    /**
     * POST /v1/mobile/pindah-sekolah
     * Ajukan permohonan pindah sekolah.
     * Syarat: semua tagihan harus lunas.
     */
    public function store(Request $request): JsonResponse
    {
        $request->validate([
            'tgl' => 'required|date|after_or_equal:today',
            'sek' => 'required|string|max:200',
            'ala' => 'required|string|min:10|max:1000',
        ]);

        /** @var Siswa|null $siswa */
        $siswa = $request->attributes->get('auth_siswa');

        if (!$siswa) {
            return response()->json([
                'success' => false,
                'message' => 'Data siswa tidak ditemukan.',
            ], 404);
        }

        // Cek apakah tagihan sudah lunas
        $now = now();
        $totalTagihan = max(0, Tsalpenrut::query()
            ->where('idsis', $siswa->id)
            ->whereIn('sta', [0, 1])
            ->where(function ($query) use ($now) {
                $query->where('tah', '<', $now->year)
                    ->orWhere(function ($query) use ($now) {
                        $query->where('tah', $now->year)
                            ->where('bulid', '<=', $now->month);
                    });
            })
            ->get()
            ->sum('jumlah'));

        if ($totalTagihan > 0) {
            throw ValidationException::withMessages([
                'tagihan' => ['Anda harus melunasi semua tagihan terlebih dahulu sebelum mengajukan pindah sekolah.'],
            ]);
        }

        // Cek apakah sudah ada pengajuan yang aktif (menunggu atau disetujui)
        $existing = Tsispindah::where('idsis', $siswa->id)
            ->whereIn('sta', ['menunggu', 'disetujui'])
            ->first();

        if ($existing) {
            return response()->json([
                'success' => false,
                'message' => 'Anda sudah memiliki pengajuan pindah sekolah yang sedang diproses.',
                'data'    => [
                    'pindah' => $this->transformPindah($existing),
                ],
            ], 409);
        }

        // Ambil kelas dari data siswa (tidak bisa diubah user)
        $siswa->loadMissing('kelsis');
        $kelas = $siswa->kel ?? $siswa->getRawOriginal('kel') ?? '-';

        $pindah = DB::connection('mai1')->transaction(function () use ($request, $siswa, $kelas) {
            return Tsispindah::create([
                'nops'  => 'PS-' . strtoupper(uniqid()),
                'idsis' => $siswa->id,
                'tgl'   => $request->tgl,
                'kelas' => $kelas,
                'sek'   => $request->sek,
                'ala'   => $request->ala,
                'sta'   => 'menunggu',
            ]);
        });

        return response()->json([
            'success' => true,
            'message' => 'Pengajuan pindah sekolah berhasil dikirim. Menunggu persetujuan sekolah.',
            'data'    => [
                'pindah' => $this->transformPindah($pindah),
            ],
        ], 201);
    }

    /**
     * DELETE /v1/mobile/pindah-sekolah/{id}/cancel
     * Batalkan pengajuan pindah sekolah (hanya jika status masih 'menunggu').
     */
    public function cancel(Request $request, int $id): JsonResponse
    {
        /** @var Siswa|null $siswa */
        $siswa = $request->attributes->get('auth_siswa');

        if (!$siswa) {
            return response()->json([
                'success' => false,
                'message' => 'Data siswa tidak ditemukan.',
            ], 404);
        }

        $pindah = Tsispindah::where('id', $id)
            ->where('idsis', $siswa->id)
            ->first();

        if (!$pindah) {
            return response()->json([
                'success' => false,
                'message' => 'Pengajuan tidak ditemukan.',
            ], 404);
        }

        if ($pindah->sta !== 'menunggu') {
            return response()->json([
                'success' => false,
                'message' => 'Pengajuan yang sudah diproses tidak dapat dibatalkan.',
            ], 422);
        }

        $pindah->update(['sta' => 'dibatalkan']);

        return response()->json([
            'success' => true,
            'message' => 'Pengajuan pindah sekolah berhasil dibatalkan.',
        ]);
    }

    // ─── Helpers ──────────────────────────────────────────────────────────────

    protected function transformPindah(Tsispindah $pindah): array
    {
        return [
            'id'         => $pindah->id,
            'nops'       => $pindah->nops,
            'tgl'        => $pindah->tgl,
            'kelas'      => $pindah->kelas,
            'sek'        => $pindah->sek,
            'ala'        => $pindah->ala,
            'sta'        => $pindah->sta,
            'created_at' => $pindah->created_at?->toISOString(),
        ];
    }
}
