<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Models\Audit;
use App\Models\Notification;
use App\Models\Bagian;
use App\Models\Tema;
use Carbon\Carbon;
use Illuminate\Pagination\LengthAwarePaginator;

class AuditController extends Controller
{
    // =========================
    // LIST AUDIT (OPEN)
    // =========================
    public function index(Request $request)
    {
        // Reset filter
        if ($request->has('reset')) {
            session()->forget(['filter_tema_audit', 'filter_bulan_audit', 'filter_tahun_audit', 'limit_audit']);
            session(['limit_audit' => 10]);
            return redirect()->route('admin.audit');
        }

        // Simpan filter ke session
        if ($request->hasAny(['filter_tema', 'filter_bulan', 'filter_tahun', 'limit'])) {
            session([
                'filter_tema_audit'  => $request->filter_tema ?: null,
                'filter_bulan_audit' => $request->filter_bulan ?: null,
                'filter_tahun_audit' => $request->filter_tahun ?: null,
                'limit_audit'        => $request->limit ?: 10,
            ]);
        }

        $filterTema   = session('filter_tema_audit', null);
        $filterBulan  = session('filter_bulan_audit', null);
        $filterTahun  = session('filter_tahun_audit', null);
        $limit        = session('limit_audit', 10);

        // --- Auto-close: jika periode dari audit sudah close (status=0), tutup audit-nya juga
        Audit::where('status', 'open')
            ->whereHas('periode', fn($q) => $q->where('status', 0))
            ->update(['status' => 'close']);

        $isFiltered = $filterTema || $filterBulan || $filterTahun;

        if ($isFiltered) {
        $auditBulanIni = Audit::with(['bagian', 'periode', 'tema'])
            ->where('status', 'open')
            ->whereNull('tanggal_verifikasi')
            ->whereNull('pic_perbaikan') // hanya yang belum ada PIC
            ->when($filterTema, function($q) use ($filterTema) {
                $q->whereHas('tema', fn($q2) => $q2->where('nama', $filterTema));
            })
            ->when($filterBulan, fn($q) => $q->whereMonth('tanggal_audit', $filterBulan))
            ->when($filterTahun, fn($q) => $q->whereYear('tanggal_audit', $filterTahun))
            ->latest('tanggal_audit')
            ->paginate($limit)
            ->appends([
                'filter_tema'  => $filterTema,
                'filter_bulan' => $filterBulan,
                'filter_tahun' => $filterTahun,
                'limit'        => $limit,
            ]);
            } else {
                // ❗ default: tampilkan semua audit open tanpa filter
                $auditBulanIni = Audit::with(['bagian', 'periode', 'tema'])
                    ->where('status', 'open')
                    ->whereNull('tanggal_verifikasi')
                    ->whereNull('pic_perbaikan') // masih belum ada PIC
                    ->latest('tanggal_audit')
                    ->paginate($limit);
            }


        $semuaAuditOpen = Audit::with(['bagian', 'periode', 'tema'])
            ->where('status', 'open')
            ->whereNull('tanggal_verifikasi')
            ->whereNotNull('pic_perbaikan')
            ->latest('tanggal_audit')
            ->get();

        $now = Carbon::now();
        $bulanIniStr   = $now->format('Y-m');
        $bulanKemarin  = $now->copy()->subMonth()->format('Y-m');

        // cek ada audit di bulan ini (berdasarkan tanggal_audit audit)
        $isBulanAudit = Audit::where('tanggal_audit', 'like', "$bulanIniStr%")->exists();

        $auditBulanKemarin = !$isBulanAudit
            ? Audit::with(['bagian', 'periode'])
                ->where('tanggal_audit', 'like', "$bulanKemarin%")
                ->where('status', 'close')
                ->latest('tanggal_audit')
                ->get()
            : collect();

        // List tema buat filter
        $temaList = Tema::orderBy('nama')->pluck('nama');

        // Tahun unik dari tanggal_audit (kolom audit)
        $tahunList = Audit::whereNotNull('tanggal_audit')
            ->pluck('tanggal_audit')
            ->map(fn($d) => date('Y', strtotime($d)))
            ->unique()
            ->sortDesc()
            ->values();

        return view('admin.audit', compact(
            'auditBulanIni',
            'semuaAuditOpen',
            'auditBulanKemarin',
            'isBulanAudit',
            'temaList',
            'tahunList',
            'limit',
            'filterTema',
            'filterBulan',
            'filterTahun'
        ));
    }

    // =========================
    // LIST AUDIT TER-VERIFIKASI (masih OPEN menunggu close)
    // =========================
    public function verifikasiClose(Request $request)
    {
  
        if ($request->has('reset')) {
            session()->forget([
                'filter_tema_verifikasi',
                'filter_bulan_verifikasi',
                'filter_tahun_verifikasi',
                'limit_verifikasi'
            ]);
            session(['limit_verifikasi' => 10]);
            return redirect()->route('admin.audit.verifikasi');
        }

        if ($request->hasAny(['filter_tema', 'filter_bulan', 'filter_tahun', 'limit'])) {
            session([
                'filter_tema_verifikasi'  => $request->filter_tema ?: null,
                'filter_bulan_verifikasi' => $request->filter_bulan ?: null,
                'filter_tahun_verifikasi' => $request->filter_tahun ?: null,
                'limit_verifikasi'        => $request->limit ?: 10,
            ]);
        }

        $filterTema  = session('filter_tema_verifikasi', null);
        $filterBulan = session('filter_bulan_verifikasi', null);
        $filterTahun = session('filter_tahun_verifikasi', null);
        $limit       = session('limit_verifikasi', 10);

        // Jika tidak ada filter, tampilkan kosong
        if (!$filterTema && !$filterBulan && !$filterTahun) {
            $auditClose = new LengthAwarePaginator([], 0, $limit, $request->input('page', 1), [
                'path'  => $request->url(),
                'query' => $request->query(),
            ]);
        } else {
            // Audit yang sudah diverifikasi tapi belum close
            $auditClose = Audit::with(['bagian', 'periode', 'tema'])
                ->where('status', 'open')
                ->whereNotNull('tanggal_verifikasi') // kolom audit
                ->when($filterTema, fn($q) => $q->whereHas('tema', fn($q2) => $q2->where('nama', $filterTema)))
                ->when($filterBulan, fn($q) => $q->whereMonth('tanggal_verifikasi', $filterBulan))
                ->when($filterTahun, fn($q) => $q->whereYear('tanggal_verifikasi', $filterTahun))
                ->orderByDesc('tanggal_verifikasi')
                ->paginate($limit)
                ->appends([
                    'filter_tema'  => $filterTema,
                    'filter_bulan' => $filterBulan,
                    'filter_tahun' => $filterTahun,
                    'limit'        => $limit,
                ]);
        }

        $semuaAuditTerverifikasi = Audit::with(['bagian', 'periode'])
            ->where('status', 'open')
            ->whereNotNull('tanggal_verifikasi')
            ->orderByDesc('tanggal_verifikasi')
            ->get();

        $temaList = Tema::orderBy('nama')->pluck('nama');

        $tahunList = Audit::whereNotNull('tanggal_verifikasi')
            ->pluck('tanggal_verifikasi')
            ->map(fn($d) => date('Y', strtotime($d)))
            ->unique()
            ->sortDesc()
            ->values();

        return view('admin.audit-verifikasi', compact(
            'auditClose',
            'semuaAuditTerverifikasi',
            'temaList',
            'tahunList',
            'filterTema',
            'filterBulan',
            'filterTahun',
            'limit'
        ));
    }

    // =========================
    // DETAIL / EDIT
    // =========================
    public function show($id)
    {
        $audit = Audit::with('bagian', 'user.bagian', 'periode')->findOrFail($id);

        // Standarisasi fallback kalau null
        if (empty($audit->status) || !in_array(strtolower($audit->status), ['open', 'close'])) {
            $audit->status = 'open';
        }

        $bagianList = Bagian::orderBy('nama_bagian')->get();
        return view('admin.audit-detail', compact('audit', 'bagianList'));
    }

    public function edit($id)
    {
        $admin = auth('admin')->user();
        abort_if($admin->role !== 'superadmin', 403, 'Akses ditolak. Hanya superadmin yang dapat mengedit audit.');

        $audit = Audit::with(['bagian', 'periode', 'tema'])->findOrFail($id);
        $temaList = Tema::orderBy('nama')->pluck('nama');

        return view('admin.audit-edit', compact('audit', 'temaList'));
    }

    public function update(Request $request, $id)
{
    $admin = auth('admin')->user();
    abort_if($admin->role !== 'superadmin', 403, 'Akses ditolak.');

    $request->validate([
        'tema'               => 'required|string|max:255',
        'kategori'           => 'required|string|max:100',
        'lokasi'             => 'nullable|string|max:255',
        'status'             => 'required|in:open,close',
        'tanggal_audit'      => 'nullable|date',
        'tanggal_verifikasi' => 'nullable|date|after_or_equal:tanggal_audit',
    ]);

    $audit = Audit::findOrFail($id);

    // Field yang pasti dikirim dari form
    $data = [
        'tema'               => $request->input('tema'),
        'kategori'           => $request->input('kategori'),
        'lokasi'             => $request->input('lokasi'),
        'status'             => strtolower($request->input('status')),
        'keterangan_sesudah' => $request->input('keterangan_sesudah'),
        'pic_perbaikan'      => $request->input('pic_perbaikan'),
        'bagian_id'          => $request->input('bagian_id'),
        'tanggal_verifikasi' => $request->input('tanggal_verifikasi'),
    ];

    // ❗ TIDAK meng-overwrite tanggal_audit kalau tidak dikirim
    if ($request->filled('tanggal_audit')) {
        $data['tanggal_audit'] = $request->input('tanggal_audit');
    }

    $audit->update($data);

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


    // =========================
    // HAPUS
    // =========================
    public function destroy($id)
    {
        $admin = auth('admin')->user();
        abort_if($admin->role !== 'superadmin', 403, 'Akses ditolak. Hanya superadmin yang dapat menghapus audit.');

        $audit = Audit::findOrFail($id);
        $audit->delete();

        return redirect()->route('admin.audit')->with('success', 'Audit berhasil dihapus.');
    }

    // =========================
    // VERIFIKASI (SET TANGGAL)
    // =========================
    public function tentukanVerifikasi(Request $request, $id)
    {
        $request->validate([
            'tanggal_verifikasi' => 'required|date|after_or_equal:today',
        ]);

        DB::transaction(function () use ($id, $request) {
            $audit = Audit::findOrFail($id);
            if (!$audit->user_id) return;

            // Tidak bikin periode baru di sini; cukup set tanggal verifikasi di audit
            $audit->update([
                'tanggal_verifikasi' => $request->tanggal_verifikasi,
            ]);

            Notification::create([
                'user_id'  => $audit->user_id,
                'audit_id' => $audit->id,
                'jenis'    => 'verifikasi',
                'judul'    => '📅 Jadwal Verifikasi Audit',
                'isi'      => 'Audit dengan tema "' . $audit->tema . '" akan diverifikasi pada ' .
                    Carbon::parse($request->tanggal_verifikasi)->translatedFormat('d F Y') . '.',
                'icon'     => '🔍',
                'warna'    => 'blue',
            ]);
        });

        return redirect()->route('admin.audit')->with('success', 'Tanggal verifikasi berhasil ditentukan & notifikasi dikirim.');
    }

    public function setAllVerifikasi(Request $request)
    {
        $request->validate([
            'audit_ids'          => 'required|string',
            'tanggal_verifikasi' => 'required|date|after_or_equal:today',
        ]);

        $ids = array_filter(explode(',', $request->audit_ids));

        try {
            Audit::whereIn('id', $ids)->update([
                'tanggal_verifikasi' => $request->tanggal_verifikasi
            ]);

            return redirect()->back()->with('success', 'Tanggal verifikasi audit berhasil ditentukan.');
        } catch (\Exception $e) {
            return redirect()->back()->with('error', 'Gagal menyimpan tanggal verifikasi: ' . $e->getMessage());
        }
    }

    public function setAllAudit(Request $request)
    {
        $request->validate([
            'audit_ids'     => 'required|string',
            'tanggal_audit' => 'required|date|after_or_equal:today',
        ]);

        $ids = array_filter(explode(',', $request->audit_ids));

        try {
            Audit::whereIn('id', $ids)->update([
                'tanggal_audit' => $request->tanggal_audit
            ]);

            return redirect()->back()->with('success', 'Tanggal audit berhasil ditentukan.');
        } catch (\Exception $e) {
            return redirect()->back()->with('error', 'Gagal menyimpan tanggal audit: ' . $e->getMessage());
        }
    }

    // =========================
    // RIWAYAT
    // =========================
    public function riwayatSemua(Request $request)
    {
        if ($request->has('reset')) {
            session()->forget([
                'filter_tema_riwayat',
                'filter_status_riwayat',
                'filter_tanggal_audit_riwayat',
                'filter_tanggal_verifikasi_riwayat',
                'limit_riwayat',
                'sort_order_riwayat',
            ]);
            session(['limit_riwayat' => 10]);
            return redirect()->route('admin.audit.riwayat');
        }

        if ($request->hasAny(['filter_tema', 'filter_status', 'filter_tanggal_audit', 'filter_tanggal_verifikasi', 'limit', 'sort'])) {
            session([
                'filter_tema_riwayat'               => $request->filter_tema ?: null,
                'filter_status_riwayat'             => $request->filter_status ?: null,
                'filter_tanggal_audit_riwayat'      => $request->filter_tanggal_audit ?: null,
                'filter_tanggal_verifikasi_riwayat' => $request->filter_tanggal_verifikasi ?: null,
                'limit_riwayat'                     => $request->limit ?: 10,
                'sort_order_riwayat'                => in_array($request->sort, ['asc', 'desc']) ? $request->sort : 'desc',
            ]);
        }

        $filterTema         = session('filter_tema_riwayat', null);
        $filterStatus       = session('filter_status_riwayat', null);
        $filterTanggalAudit = session('filter_tanggal_audit_riwayat', null);
        $filterTanggalVerif = session('filter_tanggal_verifikasi_riwayat', null);
        $limit              = session('limit_riwayat', 10);
        $sortOrder          = session('sort_order_riwayat', 'desc');

        $statusList = ['open', 'close'];

        $query = Audit::with(['bagian', 'periode', 'tema']);

        if ($filterTema) {
            $query->whereHas('tema', fn($q) => $q->where('nama', $filterTema));
        }

        if ($filterStatus === 'open') {
            $query->where('status', 'open');
        } elseif ($filterStatus === 'close') {
            $query->where('status', 'close');
        }

        if ($filterTanggalAudit) {
            [$y, $m] = explode('-', $filterTanggalAudit); // format Y-m
            $query->whereYear('tanggal_audit', $y)->whereMonth('tanggal_audit', $m);
        }

        if ($filterTanggalVerif) {
            [$y, $m] = explode('-', $filterTanggalVerif);
            $query->whereNotNull('tanggal_verifikasi')
                ->whereYear('tanggal_verifikasi', $y)
                ->whereMonth('tanggal_verifikasi', $m);
        }

        $auditList = $query->orderBy('tanggal_audit', $sortOrder)
            ->paginate($limit)
            ->appends([
                'filter_tema'               => $filterTema,
                'filter_status'             => $filterStatus,
                'filter_tanggal_audit'      => $filterTanggalAudit,
                'filter_tanggal_verifikasi' => $filterTanggalVerif,
                'limit'                     => $limit,
                'sort'                      => $sortOrder,
            ]);

        $temaList = Tema::orderBy('nama')->pluck('nama');

        $tanggalAuditList = Audit::whereNotNull('tanggal_audit')
            ->pluck('tanggal_audit')
            ->map(fn($d) => date('Y-m', strtotime($d)))
            ->unique()
            ->sortDesc()
            ->values();

        $tanggalVerifList = Audit::whereNotNull('tanggal_verifikasi')
            ->pluck('tanggal_verifikasi')
            ->map(fn($d) => date('Y-m', strtotime($d)))
            ->unique()
            ->sortDesc()
            ->values();

        return view('admin.audit-riwayat', compact(
            'auditList',
            'temaList',
            'statusList',
            'tanggalAuditList',
            'tanggalVerifList',
            'filterTema',
            'filterStatus',
            'filterTanggalAudit',
            'filterTanggalVerif',
            'limit',
            'sortOrder'
        ));
    }

    public function verifikasiDetail($id)
    {
        $audit = Audit::with('bagian', 'user.bagian', 'periode')->findOrFail($id);
        $bagianList = Bagian::orderBy('nama_bagian')->get();

        return view('admin.verifikasi-detail', compact('audit', 'bagianList'));
    }

    public function riwayatDetail($id)
    {
        $audit = Audit::with(['bagian', 'user', 'periode'])->findOrFail($id);
        return view('admin.riwayat-detail', compact('audit'));
    }
}
