<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Tema;
use App\Models\Periode;
use App\Models\Audit; // <— pakai untuk update status audit
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; // <— transaksi
use Carbon\Carbon;

class JadwalController extends Controller
{
    public function index(Request $request)
    {
        // Semua tema
        $temaList = Tema::all();

        // Tema aktif (ada periode yang belum selesai)
        $temaAktif = Tema::with(['periode' => function($q) {
            $q->whereNull('tanggal_selesai');
        }])->get()->filter(function($tema) {
            return $tema->periode->count() > 0;
        });

        // Tangkap filter tahun dari request atau session
        if ($request->has('tahun')) {
            $tahunDipilih = $request->tahun;
            session(['filter_tahun' => $tahunDipilih]);
        } else {
            $tahunDipilih = session('filter_tahun', '');
        }

        // Ambil periode, filter jika ada tahunDipilih
        $periodeQuery = Periode::with('tema');
        if ($tahunDipilih) {
            $periodeQuery->where('nama_periode', 'like', "%{$tahunDipilih}%");
        }

        $jadwalList = $periodeQuery->get()->map(function ($item) {
            return (object) [
                'id'              => $item->id,
                'tema_id'         => $item->tema_id,
                'tema'            => $item->tema?->nama ?? '-',
                'tanggal_mulai'   => $item->tanggal_mulai ? Carbon::parse($item->tanggal_mulai)->format('Y-m-d') : '',
                'tanggal_selesai' => $item->tanggal_selesai ? Carbon::parse($item->tanggal_selesai)->format('Y-m-d') : null,
                'periode'         => $item->nama_periode,
                'status'          => $item->status == 1 ? 'open' : 'close',
            ];
        });

        // Daftar tahun unik dari semua periode
        $tahunList = Periode::pluck('nama_periode')
            ->map(function($periode) {
                preg_match_all('/\d{4}/', $periode, $matches);
                return $matches[0] ?? [];
            })
            ->flatten()
            ->unique()
            ->sort()
            ->values();

        return view('admin.jadwal', compact('temaList', 'temaAktif', 'jadwalList', 'tahunList', 'tahunDipilih'));
    }

    public function storeAudit(Request $request)
    {
        $request->validate([
            'tema_id'       => 'required|exists:tema,id',
            'tanggal_mulai' => 'required|date',
            'bulan_akhir'   => 'required',
        ]);

        // Cek apakah tema masih open (ada periode aktif)
        $tema = Tema::with(['periode' => function($q){
            $q->whereNull('tanggal_selesai')->where('status', 1);
        }])->findOrFail($request->tema_id);

        if ($tema->periode->count() > 0) {
            return back()->with('error', 'Tema masih open. Tutup/Close Tema terlebih dahulu.');
        }

        // Mapping bulan bahasa Indonesia ke angka
        $bulanMap = [
            'januari' => 1, 'februari' => 2, 'maret' => 3, 'april' => 4,
            'mei' => 5, 'juni' => 6, 'juli' => 7, 'agustus' => 8,
            'september' => 9, 'oktober' => 10, 'november' => 11, 'desember' => 12
        ];

        // Ambil bulan awal & tahun dari tanggal mulai
        $bulanAwalNum = Carbon::parse($request->tanggal_mulai)->month;
        $bulanAwal    = Carbon::parse($request->tanggal_mulai)->translatedFormat('F');
        $tahunAwal    = Carbon::parse($request->tanggal_mulai)->year;

        // Bersihkan input bulan akhir
        $bulanAkhirInput = trim(strtolower($request->bulan_akhir));

        // Konversi bulan akhir ke angka
        $bulanAkhirNum = is_numeric($bulanAkhirInput)
            ? (int) $bulanAkhirInput
            : ($bulanMap[$bulanAkhirInput] ?? null);

        if (!$bulanAkhirNum || $bulanAkhirNum < 1 || $bulanAkhirNum > 12) {
            return back()->withErrors(['bulan_akhir' => 'Bulan akhir tidak valid.']);
        }

        $bulanAkhir = Carbon::createFromDate($tahunAwal, $bulanAkhirNum, 1)->translatedFormat('F');
        $tahunAkhir = $tahunAwal;
        if ($bulanAkhirNum < $bulanAwalNum) {
            $tahunAkhir++;
        }

        // Buat nama periode
        $namaPeriode = "{$bulanAwal} {$tahunAwal} - {$bulanAkhir} {$tahunAkhir}";

        // Simpan periode dengan tema_id
        Periode::create([
            'tema_id'         => $request->tema_id,
            'nama_periode'    => $namaPeriode,
            'tanggal_mulai'   => $request->tanggal_mulai,
            'tanggal_selesai' => null,
            'status'          => 1,
        ]);

        return back()->with('success', 'Jadwal audit berhasil dibuat.');
    }

    public function storeVerifikasi(Request $request)
    {
        $request->validate([
            'periode_id'      => 'required|exists:periode,id',
            'tanggal_selesai' => 'required|date|after_or_equal:today',
        ]);

        $periode = Periode::findOrFail($request->periode_id);

        $periode->update([
            'tanggal_selesai' => $request->tanggal_selesai
        ]);

        return back()->with('success', 'Tanggal verifikasi berhasil ditentukan.');
    }

    public function toggleStatus($id)
{
    $periode = Periode::findOrFail($id);

    DB::transaction(function () use ($periode) {
        $closing   = ($periode->status == 1); // 1=open → mau close
        $newStatus = $closing ? 0 : 1;

        // kalau ditutup & tanggal_selesai masih null → set hari ini, biar rentang jelas
        if ($closing && is_null($periode->tanggal_selesai)) {
            $periode->tanggal_selesai = now()->toDateString();
        }
        $periode->status = $newStatus;
        $periode->save();

        if ($newStatus === 0) {
            // 1) close audit yg SUDAH link ke periode ini
            $closedLinked = Audit::where('tema_id', $periode->tema_id)
                ->where('periode_id', $periode->id)
                ->where(function($q){
                    $q->whereNull('status')->orWhereRaw('LOWER(TRIM(status))="open"');
                })
                ->update(['status' => 'close']);

            // 2) close + backfill audit yg tanggalnya masuk rentang & periode_id masih NULL
            $dateStart = Carbon::parse($periode->tanggal_mulai)->toDateString();
            $dateEnd   = Carbon::parse($periode->tanggal_selesai ?? now())->toDateString();

            $closedBackfilled = Audit::where('tema_id', $periode->tema_id)
                ->whereNull('periode_id')
                ->whereNotNull('tanggal_audit')
                ->whereBetween('tanggal_audit', [$dateStart, $dateEnd])
                ->where(function($q){
                    $q->whereNull('status')->orWhereRaw('LOWER(TRIM(status))="open"');
                })
                ->update([
                    'status'     => 'close',
                    'periode_id' => $periode->id,
                ]);

            session()->flash('success', "Periode ditutup. Closed linked: {$closedLinked}, Closed backfilled: {$closedBackfilled}");
        } else {
            // OPSIONAL: re-open audit yang ter-link ke periode ini
            Audit::where('tema_id', $periode->tema_id)
                ->where('periode_id', $periode->id)
                ->whereRaw('LOWER(TRIM(status))="close"')
                ->update(['status' => 'open']);

            session()->flash('success', 'Periode dibuka kembali. Audit terkait di-open.');
        }
    });

    return back();
}


    public function update(Request $request, $id)
    {
        $jadwal = Periode::findOrFail($id);

        // Update hanya field yang dikirim & valid di tabel periode
        $data = [];
        if ($request->has('tema_id')) {
            $data['tema_id'] = $request->input('tema_id');
        }
        if ($request->has('tanggal_mulai')) {
            $data['tanggal_mulai'] = $request->input('tanggal_mulai');
        }
        if ($request->has('tanggal_selesai')) {
            $data['tanggal_selesai'] = $request->input('tanggal_selesai');
        }
        if ($request->has('status')) {
            // terima 1/0 atau 'open'/'close'
            $val = $request->input('status');
            if (is_numeric($val)) {
                $data['status'] = (int) $val ? 1 : 0;
            } else {
                $data['status'] = strtolower($val) === 'open' ? 1 : 0;
            }
        }

        if (!empty($data)) {
            $jadwal->update($data);
        }

        return back()->with('success', 'Jadwal berhasil diperbarui.');
    }

    public function destroy($id)
{
    // opsional: batasi hanya superadmin yang boleh hapus
    $admin = auth('admin')->user();
    abort_if(!$admin || $admin->role !== 'superadmin', 403, 'Akses ditolak.');

    try {
        DB::transaction(function () use ($id) {
            $periode = Periode::findOrFail($id);

            // Lepaskan relasi audit agar tidak kena FK constraint (set NULL)
            Audit::where('periode_id', $periode->id)->update(['periode_id' => null]);

            // Hapus periode (jadwal)
            $periode->delete();
        });

        return back()->with('success', 'Jadwal berhasil dihapus.');
    } catch (\Throwable $e) {
        return back()->with('error', 'Gagal menghapus jadwal: '.$e->getMessage());
    }
}

}
