<?php

namespace App\Http\Controllers\Instansi;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Absensi;
use App\Models\Karyawan;
use App\Models\Jabatan;
use App\Models\IzinSakit;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;

class AbsensiController extends Controller
{
    public function index(Request $request)
    {
        $instansiId = Auth::user()->instansi_id;

        $tanggal    = $request->input('tanggal', today()->toDateString());
        $karyawanId = $request->input('karyawan_id');
        $jabatanId  = $request->input('jabatan_id');
        $status     = $request->input('status'); // hadir|terlambat|belum_absen|izin|sakit
        $bulan      = $request->input('bulan');
        $perPage    = (int) $request->input('per_page', 20);

        // Semua karyawan instansi
        $karyawanQuery = Karyawan::with(['user', 'jabatan'])
            ->where('instansi_id', $instansiId);
        if ($karyawanId) $karyawanQuery->where('id', $karyawanId);
        if ($jabatanId)  $karyawanQuery->where('jabatan_id', $jabatanId);
        $semuaKaryawan = $karyawanQuery->get();

        // Absensi data
        $absensiQuery = Absensi::whereHas('karyawan', fn($q) => $q->where('instansi_id', $instansiId));
        if ($bulan) {
            [$y, $m] = explode('-', $bulan);
            $absensiQuery->whereYear('tanggal', $y)->whereMonth('tanggal', $m);
        } else {
            $absensiQuery->whereDate('tanggal', $tanggal);
        }
        // Untuk mode harian: ambil satu absensi per karyawan (jam_masuk terbaru)
        $absensiData = $absensiQuery->orderByDesc('jam_masuk')->get()->keyBy('karyawan_id');

        // Izin/Sakit yang disetujui dan aktif pada tanggal
        $izinQuery = IzinSakit::whereHas('karyawan', fn($q) => $q->where('instansi_id', $instansiId))
            ->where('status', 'disetujui');
        if ($bulan) {
            [$y, $m] = explode('-', $bulan);
            $startBulan = Carbon::createFromDate($y, $m, 1)->startOfMonth();
            $endBulan   = Carbon::createFromDate($y, $m, 1)->endOfMonth();
            $izinQuery->where('tanggal_mulai', '<=', $endBulan)->where('tanggal_selesai', '>=', $startBulan);
        } else {
            $izinQuery->where('tanggal_mulai', '<=', $tanggal)->where('tanggal_selesai', '>=', $tanggal);
        }
        $izinData = $izinQuery->get()->keyBy('karyawan_id');

        // Susun monitoring per karyawan
        $monitoringData = $semuaKaryawan->map(function($kar) use ($absensiData, $izinData) {
            $ab   = $absensiData->get($kar->id);
            $izin = $izinData->get($kar->id);

            if ($ab && $ab->jam_masuk) {
                $statusKode = $ab->status_waktu === 'terlambat' ? 'terlambat' : 'hadir';
            } elseif ($izin) {
                $statusKode = $izin->jenis; // 'izin' atau 'sakit'
            } else {
                $statusKode = 'belum_absen';
            }

            return [
                'id'              => $kar->id,
                'nama'            => $kar->user->name ?? $kar->nama ?? '-',
                'jabatan'         => $kar->jabatan->nama_jabatan ?? $kar->jabatan->nama ?? '-',
                'status'          => $statusKode,
                'jam_masuk'       => $ab?->jam_masuk,
                'jam_pulang'      => $ab?->jam_pulang,
                'terlambat_menit' => $ab?->terlambat_menit ?? 0,
                'foto_masuk'      => $ab?->foto_masuk ? asset('storage/' . $ab->foto_masuk) : null,
                'foto_pulang'     => $ab?->foto_pulang ? asset('storage/' . $ab->foto_pulang) : null,
                'latitude'        => $ab?->latitude_masuk,
                'longitude'       => $ab?->longitude_masuk,
                'keterangan_izin' => $izin?->keterangan,
                'tanggal_izin'    => $izin
                    ? Carbon::parse($izin->tanggal_mulai)->format('d M') . '–' . Carbon::parse($izin->tanggal_selesai)->format('d M Y')
                    : null,
            ];
        });

        // Filter by status
        if ($status) {
            $monitoringData = $monitoringData->filter(fn($r) => $r['status'] === $status);
        }

        // Stats (dari data asli sebelum filter)
        $allData       = $semuaKaryawan->map(function($kar) use ($absensiData, $izinData) {
            $ab   = $absensiData->get($kar->id);
            $izin = $izinData->get($kar->id);
            if ($ab && $ab->jam_masuk) return $ab->status_waktu === 'terlambat' ? 'terlambat' : 'hadir';
            if ($izin) return $izin->jenis;
            return 'belum_absen';
        });
        $totalKaryawan = $semuaKaryawan->count();
        $statHadir     = $allData->filter(fn($s) => in_array($s, ['hadir', 'terlambat']))->count();
        $statTepat     = $allData->filter(fn($s) => $s === 'hadir')->count();
        $statTerlambat = $allData->filter(fn($s) => $s === 'terlambat')->count();
        $statBelum     = $allData->filter(fn($s) => $s === 'belum_absen')->count();
        $statIzin      = $allData->filter(fn($s) => $s === 'izin')->count();
        $statSakit     = $allData->filter(fn($s) => $s === 'sakit')->count();

        // Manual paginate
        $page      = max(1, (int) $request->input('page', 1));
        $total     = $monitoringData->count();
        $paginated = $monitoringData->values()->forPage($page, $perPage);

        $karyawanList = Karyawan::with('user')->where('instansi_id', $instansiId)->get();
        $jabatanList  = Jabatan::where('instansi_id', $instansiId)->get();

        return view('instansi.absensi.index', compact(
            'paginated', 'total', 'page', 'perPage',
            'karyawanList', 'jabatanList',
            'tanggal', 'karyawanId', 'jabatanId', 'status', 'bulan',
            'statHadir', 'statTepat', 'statTerlambat', 'statBelum',
            'statIzin', 'statSakit', 'totalKaryawan'
        ));
    }
}