<?php

namespace App\Http\Controllers;
use Maatwebsite\Excel\Facades\Excel;
use App\Exports\SafetyExport;
use App\Models\IzinPenerimaanTamu;
use Illuminate\Http\Request;
use Carbon\Carbon;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
use Barryvdh\DomPDF\Facade\Pdf;
use App\Exports\IzinTamuExport; 
use App\Exports\SafetyAllExport;
use Illuminate\Support\Facades\DB;
use App\Notifications\TamuBaruNotification;
use App\Models\Admin;
use Illuminate\Support\Facades\App; // Import App facade

class IzinPenerimaanTamuController extends Controller
{
    /**
     * Menampilkan daftar data izin penerimaan tamu (pagination 10 data terbaru).
     */
   public function index()
    {
        $data = IzinPenerimaanTamu::orderBy('waktu_mulai', 'desc') 
                                  ->orderBy('waktu_selesai', 'desc')
                                  ->get(); // Kalau data ribuan, hati-hati pakai get(), loading bisa berat.

        return view('izin_tamu.index', compact('data'));
    }

    public function indexAdmin()
    {
        $data = IzinPenerimaanTamu::orderBy('waktu_mulai', 'desc')
                                  ->orderBy('waktu_selesai', 'desc')
                                  ->paginate(10);
                                  
        return view('izin_tamu.admin_izin.index', compact('data'));
    }

    /**
     * Menampilkan daftar izin tamu untuk Security
     * Hanya bisa Safety & Barcode.
     */
    public function indexSecurity()
{
    // Ambil tanggal hari ini
    $today = \Carbon\Carbon::today()->toDateString(); // YYYY-MM-DD

    $data = IzinPenerimaanTamu::whereDate('waktu_mulai', $today)
            // Ganti latest() dengan orderBy untuk mengurutkan sesuai jam jadwal
            ->orderBy('waktu_mulai', 'asc') // 'asc' = Ascending (Pagi -> Sore)
            ->paginate(10);

    return view('izin_tamu.security.index', compact('data'));
}

public function refreshSecurityData()
{
    $today = \Carbon\Carbon::today()->toDateString();

    $data = IzinPenerimaanTamu::whereDate('waktu_mulai', $today)
            // UBAH: Samakan logic sorting dengan indexSecurity (Pagi -> Sore)
            ->orderBy('waktu_mulai', 'asc') 
            ->get();

    return response()->json($data);
}



    /**
 * Update data oleh Security (jam keluar, kendaraan, no pol, petugas jaga).
 */
public function updateSecurity(Request $request, $id)
{
    $request->validate([
        'jam_keluar'      => 'nullable|date_format:H:i',
        'jenis_kendaraan' => 'nullable|string|max:50',
        'no_pol'          => 'nullable|string|max:20',
        'petugas_jaga'    => 'nullable|string|max:100',
    ]);

    $izin = IzinPenerimaanTamu::findOrFail($id);

    // Simpan jam_keluar sebagai datetime (tanggal hari ini + jam keluar)
    if ($request->filled('jam_keluar')) {
        $izin->jam_keluar = now()->format('Y-m-d') . ' ' . $request->jam_keluar;
    }

    $izin->jenis_kendaraan = $request->jenis_kendaraan;
    $izin->no_pol          = $request->no_pol;
    $izin->petugas_jaga    = $request->petugas_jaga;

    $izin->save();

    return redirect()->route('izin_tamu.index_security')
                     ->with('success', 'Data berhasil diperbarui oleh security.');
}

    /**
     * Menampilkan form untuk input data izin penerimaan tamu baru.
     */
    public function create()
    {
        return view('izin_tamu.create');
    }

     /**
     * Menyimpan data tamu baru ke database.
     */
    public function store(Request $request)
    {
        // Validasi input
        $request->validate([
            'perusahaan'        => 'required|string|max:100',
            'nama_tamu'         => 'required|string',
            'tanggal_kunjungan' => 'required|date',
            'waktu_mulai_jam'   => 'required|date_format:H:i',
            'waktu_selesai_jam' => 'required|date_format:H:i',
            'agenda_kunjungan'  => 'nullable|string',
            'lokasi_penerimaan' => 'nullable|string|max:255',
            'yang_ditemui'      => 'nullable|string|max:255',
            'user_ditemui'     => 'nullable|string|max:255',
            'jumlah_tamu' => 'required|integer|min:1',  // ✅ baru
            'jenis_tamu' => 'required|in:Customer,Supplier,Kedinasan,Tamu BOD,Lainnya', // ✅ baru
        ]);

        

        // Gabungkan tanggal + jam jadi format datetime
        $waktuMulai = Carbon::parse($request->input('tanggal_kunjungan') . ' ' . $request->input('waktu_mulai_jam'));
        $waktuSelesai = Carbon::parse($request->input('tanggal_kunjungan') . ' ' . $request->input('waktu_selesai_jam'));

        // Cek agar waktu selesai lebih besar dari waktu mulai
        if ($waktuSelesai->lessThanOrEqualTo($waktuMulai)) {
            return redirect()->back()->withErrors(['waktu_selesai_jam' => 'Waktu selesai harus setelah waktu mulai.'])->withInput();
        }

        // Simpan data ke tabel izin_penerimaan_tamu
        $izin = IzinPenerimaanTamu::create([
        'perusahaan'        => $request->perusahaan,
        'nama_tamu'         => $request->nama_tamu,
        'waktu_mulai'       => $waktuMulai,
        'waktu_selesai'     => $waktuSelesai,
        'agenda_kunjungan'  => $request->agenda_kunjungan,
        'lokasi_penerimaan' => $request->lokasi_penerimaan,
        'yang_ditemui'      => $request->yang_ditemui,
        'user_ditemui'      => $request->user_ditemui,
        'jumlah_tamu'       => $request->jumlah_tamu,
        'jenis_tamu'        => $request->jenis_tamu,
        'jam_input'         => now()->setTimezone('Asia/Jakarta'),
]);

        // Kirim notifikasi ke semua admin
    $admins = Admin::all();
    foreach ($admins as $admin) {
        $admin->notify(new TamuBaruNotification($izin));
    }

        return redirect()
            ->route('izin_tamu.index')
            ->with('success', 'Data berhasil disimpan!')
            ->with('new_id', $izin->id);  // ✅ bawa ID buat popup checklist

    }

    /**
     * Menampilkan form edit untuk data izin penerimaan tamu tertentu.
     */
    public function edit($id)
{
    $izin = IzinPenerimaanTamu::findOrFail($id);
    return view('izin_tamu.edit', compact('izin'));
}

public function update(Request $request, $id)
{
    // 1. Tambahkan validasi untuk konsumsi_porsi
    $request->validate([
        'perusahaan'        => 'required|string|max:255',
        'nama_tamu'         => 'required|string',
        'waktu_mulai'       => 'required|date',
        'waktu_selesai'     => 'required|date|after:waktu_mulai',
        'agenda_kunjungan'  => 'nullable|string',
        'lokasi_penerimaan' => 'nullable|string|max:255',
        'yang_ditemui'      => 'nullable|string|max:255',
        'user_ditemui'      => 'nullable|string|max:255',
        'jumlah_tamu'       => 'required|integer|min:1',
        'jenis_tamu'        => 'required|in:Customer,Supplier,Kedinasan,Tamu BOD,Lainnya',
        'jam_masuk'         => 'nullable|date',
        'jam_keluar'        => 'nullable|date',
        'jenis_kendaraan'   => 'nullable|string|max:50',
        'no_pol'            => 'nullable|string|max:20',
        'petugas_jaga'      => 'nullable|string|max:100',
        'sudah_konsumsi'    => 'nullable|boolean',
        'konsumsi_porsi'    => 'nullable|integer', // ✅ Tambahkan ini agar aman
        'sudah_apd'         => 'nullable|boolean',
        'status_hadir'      => 'nullable|in:hadir,belum',
    ]);

    // Format ulang waktu jika inputnya terpisah (opsional, sesuaikan dengan form edit blade Anda)
    // Jika di form edit sudah datetime-local, bagian Carbon::parse ini bisa langsung dipakai
    
    $izin = IzinPenerimaanTamu::findOrFail($id);

    $izin->update([
        'perusahaan'        => $request->perusahaan,
        'nama_tamu'         => $request->nama_tamu,
        'waktu_mulai'       => Carbon::parse($request->waktu_mulai),
        'waktu_selesai'     => Carbon::parse($request->waktu_selesai),
        'agenda_kunjungan'  => $request->agenda_kunjungan,
        'lokasi_penerimaan' => $request->lokasi_penerimaan,
        'yang_ditemui'      => $request->yang_ditemui,
        'user_ditemui'      => $request->user_ditemui,
        'jumlah_tamu'       => $request->jumlah_tamu,
        'jenis_tamu'        => $request->jenis_tamu,
        'jam_masuk'         => $request->jam_masuk ? Carbon::parse($request->jam_masuk) : null,
        'jam_keluar'        => $request->jam_keluar ? Carbon::parse($request->jam_keluar) : null,
        'jenis_kendaraan'   => $request->jenis_kendaraan,
        'no_pol'            => $request->no_pol,
        'petugas_jaga'      => $request->petugas_jaga,
        
        // ✅ Perbaikan logika simpan konsumsi
        'sudah_konsumsi'    => $request->sudah_konsumsi ?? 0,
        'konsumsi_porsi'    => $request->konsumsi_porsi, // ✅ Masukkan ini agar tersimpan
        
        'sudah_apd'         => $request->sudah_apd ?? 0,
        'status_hadir'      => $request->status_hadir ?? 'belum',
    ]);

    return redirect()->route('izin_tamu.index_admin')->with('success', 'Data izin tamu berhasil diperbarui.');
}



    /**
     * Menghapus data izin penerimaan tamu tertentu.
     */
    public function destroy($id)
    {
        $izin = IzinPenerimaanTamu::findOrFail($id);
        $izin->delete();

        return redirect()->route('izin_tamu.index_admin')->with('success', 'Data berhasil dihapus!');
    }

    
    /**
     * Menampilkan QR Code untuk data izin tamu tertentu.
     * QR Code berisi informasi tamu (ID, nama, perusahaan, lokasi, waktu).
     */
   public function showBarcode($id)
{
    $izin = IzinPenerimaanTamu::findOrFail($id);

    // Cek apakah tamu sudah hadir
    if ($izin->status_hadir === 'hadir') {
        // Cek guard yang sedang aktif
        if (auth()->guard('security')->check()) {
            // 🟢 Perbaiki di sini
            return redirect()->route('izin_tamu.index_security')
                ->with('error', 'Tamu ini sudah hadir dan tidak bisa menggunakan barcode lagi.');
        } else {
            return redirect()->route('izin_tamu.index')
                ->with('error', 'Tamu ini sudah hadir dan tidak bisa menggunakan barcode lagi.');
        }
    }

    return view('izin_tamu.qrcode', compact('izin'));
}


    /**
     * Digunakan saat QR Code di-scan di pintu masuk.
     * Mengubah status tamu menjadi "hadir".
     */
    // GET → tampilkan halaman scan (OLD Method - still needed for ID fallback if any)
    public function scan($id)
    {
        $izin = IzinPenerimaanTamu::findOrFail($id);

        // Kalau tamu sudah hadir, langsung lempar ke ucapan
        if ($izin->status_hadir === 'hadir') {
            return redirect()->route('izin_tamu.thanks_page', $izin->id);
        }

        // Kalau belum hadir, tampilkan form safety induction
        return view('izin_tamu.qr_scan_success', compact('izin'));
    }

    /**
     * Method BARU: Scan Barcode menggunakan Token
     * URL: /s/{token}
     */
    public function scanByToken($token)
    {
        // 1. Cari data berdasarkan qr_token
        $tamu = IzinPenerimaanTamu::where('qr_token', $token)->first();

        // 2. Cek apakah data ditemukan
        if (!$tamu) {
            abort(404, 'Data Tamu Tidak Ditemukan atau Link Kadaluarsa');
        }

        // 3. Jika sudah hadir, redirect ke halaman thanks/status
        if ($tamu->status_hadir === 'hadir') {
             return redirect()->route('izin_tamu.thanks_page', $tamu->id)
                    ->with('warning', 'Tamu ini sudah check-in sebelumnya.');
        }

        // 4. Tampilkan halaman Safety Induction (seperti method scan biasa)
        // Kita pass data $tamu sebagai $izin agar view qr_scan_success tetap jalan
        $izin = $tamu; 
        return view('izin_tamu.qr_scan_success', compact('izin'));
    }

    public function thanks($id)
    {
        $izin = IzinPenerimaanTamu::findOrFail($id);

        return response()
            ->view('izin_tamu.thanks', compact('izin'))
            ->header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0')
            ->header('Pragma', 'no-cache')
            ->header('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT');
    }


// POST → simpan hasil safety injection
// POST → simpan hasil safety injection
public function storeScan(Request $request, $id)
{
    $izin = IzinPenerimaanTamu::findOrFail($id);

    // kalau sudah hadir & sudah isi safety → lempar ke thanks
    if ($izin->status_hadir === 'hadir' && $izin->safety_answers) {
        return redirect()->route('izin_tamu.thanks_page', $izin->id);
    }

    // update status hadir & jam masuk hanya sekali
    if ($izin->status_hadir !== 'hadir') {
        $izin->status_hadir = 'hadir';
        $izin->jam_masuk = now();
    }

    // ambil jawaban safety
    if ($request->has('safety_answers')) {
        $answers = $request->input('safety_answers', []);

        $totalQuestions = count($answers);
        $correct = 0;

        foreach ($answers as $ans) {
            if ($ans === "Mengerti") {
                $correct++;
            }
        }

        $score = $totalQuestions > 0 ? round(($correct / $totalQuestions) * 100) : null;

        $izin->safety_score = $score;
        $izin->safety_answers = json_encode($answers);
    }

    $izin->save();

    return redirect()->route('izin_tamu.thanks_page', $izin->id);
}


    public function safetyResult($id)
{
    $izin = IzinPenerimaanTamu::findOrFail($id);
    return view('izin_tamu.safety_result', compact('izin'));
}

public function exportAllSafety()
{
    return Excel::download(new SafetyAllExport, 'semua_safety_induction.xlsx');
}

public function exportPdf($id)
{
    $izin = IzinPenerimaanTamu::findOrFail($id);

    $jawabanList = $izin->safety_answers ? json_decode($izin->safety_answers, true) : [];

    $pertanyaanList = [
        "Berjalanlah pada jalur pejalan kaki yang sudah ditetapkan (jalur berwarna hijau)",
        "Dilarang membuang sampah sembarangan",
        "Konsumsi alkohol atau narkoba dilarang", 
        "Dilarang merokok, kecuali di area yang telah ditentukan", 
        "Dilarang mengambil foto/video di area PT. Asama Indonesia Manufacturing, kecuali diizinkan oleh petugas yang mendampingi", 
        "Saat masuk ke area produksi wajib menggunakan APD yang lengkap sesuai dengan aturan pada masing-masing bagian",                 
        "Dilarang berbicara dengan operator produksi (kecuali dengan izin supervisor)",                
        "Hati-hati dengan forklift dan truck bongkar muat barang",
    ];

    $hasil = [];
    foreach ($pertanyaanList as $i => $tanya) {
        $hasil[] = [
            'pertanyaan' => $tanya,
            'jawaban' => $jawabanList[$i] ?? 'Tidak Mengerti',
        ];
    }

    // ✅ Tambahkan ini (fix untuk hosting)
    if (!file_exists(public_path())) {
        App::instance('path.public', base_path('public_html/apps/public'));
    }

    // Generate PDF
    $pdf = Pdf::loadView('izin_tamu.export_pdf', compact('izin', 'hasil'))
              ->setPaper('A4', 'portrait');

    // ✅ Return langsung ke browser (tanpa simpan file ke public)
    return response($pdf->output())
        ->header('Content-Type', 'application/pdf')
        ->header('Content-Disposition', 'attachment; filename="safety_result_'.$izin->nama_tamu.'.pdf"');
}

public function exportExcel($id)
{
    $izin = IzinPenerimaanTamu::findOrFail($id);
    return Excel::download(new SafetyExport($izin), 'safety_result_'.$izin->nama_tamu.'.xlsx');
}

public function updateChecklist(Request $request, $id)
{
    $request->validate([
        'sudah_konsumsi' => 'nullable|boolean',
        'konsumsi_porsi' => 'nullable|integer|min:1',
        'sudah_apd'      => 'nullable|boolean',
    ]);

    $izin = IzinPenerimaanTamu::findOrFail($id);

    $izin->update([
        'sudah_konsumsi'  => $request->has('sudah_konsumsi') ? 1 : 0,
        'konsumsi_porsi'  => $request->has('sudah_konsumsi') 
                                ? ($request->konsumsi_porsi ?? 1)  // default 1 porsi
                                : null,
        'sudah_apd'       => $request->has('sudah_apd') ? 1 : 0,
    ]);

    return redirect()->route('izin_tamu.index')
        ->with('success', 'Checklist resepsionis berhasil diperbarui.');
}


public function exportFilter(Request $request)
{
    $namaTamu = $request->input('nama_tamu');
    $statusHadir = $request->input('status_hadir');
    $periode = $request->input('periode');
    $tanggalCustom = $request->input('tanggal');

    $query = IzinPenerimaanTamu::query();

    // Filter nama tamu
    if ($namaTamu) {
        $query->where('nama_tamu', 'like', "%{$namaTamu}%");
    }

    // Filter status hadir
    if ($statusHadir) {
        if ($statusHadir === 'belum hadir') {
            $query->where('status_hadir', '!=', 'hadir');
        } else {
            $query->where('status_hadir', $statusHadir);
        }
    }

    // Filter periode
    if ($periode) {
        if ($periode === 'hari_ini') {
            $query->whereDate('waktu_mulai', today());
        } elseif ($periode === 'minggu_ini') {
            $query->whereBetween('waktu_mulai', [now()->startOfWeek(), now()->endOfWeek()]);
        } elseif ($periode === 'bulan_ini') {
            $query->whereMonth('waktu_mulai', now()->month)
                  ->whereYear('waktu_mulai', now()->year);
        } elseif ($periode === 'tanggal_custom' && $tanggalCustom) {
            $query->whereDate('waktu_mulai', Carbon::parse($tanggalCustom)->format('Y-m-d'));
        }
    }

    $data = $query->orderBy('waktu_mulai', 'desc')->get();

    return view('izin_tamu.admin_izin.export_filter', compact('data'));
}


// Method khusus export Excel sesuai filter
public function exportExcelAdmin(Request $request)
{
    $namaTamu = $request->input('nama_tamu');
    $statusHadir = $request->input('status_hadir');
    $periode = $request->input('periode');
    $tanggalCustom = $request->input('tanggal'); // tanggal custom jika dipilih

    $query = IzinPenerimaanTamu::query();

    // Filter nama tamu
    if ($namaTamu) {
        $query->where('nama_tamu', 'like', "%{$namaTamu}%");
    }

    // Filter status hadir
    if ($statusHadir) {
        if ($statusHadir === 'belum hadir') {
            $query->where('status_hadir', '!=', 'hadir');
        } else {
            $query->where('status_hadir', $statusHadir);
        }
    }

    // Filter periode
    if ($periode) {
        if ($periode === 'hari_ini') {
            $query->whereDate('waktu_mulai', today());
        } elseif ($periode === 'minggu_ini') {
            $query->whereBetween('waktu_mulai', [now()->startOfWeek(), now()->endOfWeek()]);
        } elseif ($periode === 'bulan_ini') {
            $query->whereMonth('waktu_mulai', now()->month)
                  ->whereYear('waktu_mulai', now()->year);
        } elseif ($periode === 'tanggal_custom' && $tanggalCustom) {
            $query->whereDate('waktu_mulai', Carbon::parse($tanggalCustom)->format('Y-m-d'));
        }
    }

    $data = $query->orderBy('waktu_mulai', 'desc')->get();

    return Excel::download(new IzinTamuExport($data), 'izin_tamu.xlsx');
}

/**
 * Simpan tanda tangan digital user (base64 langsung ke database)
 */
public function storeSignature(Request $request, $id)
{
    $izin = IzinPenerimaanTamu::findOrFail($id);

    $request->validate([
        'signature' => 'required|string'
    ]);

    $signatureData = $request->input('signature');

    // Validasi sederhana: pastikan format base64 gambar
    if (!str_starts_with($signatureData, 'data:image/png;base64,')) {
        return response()->json(['error' => 'Format tanda tangan tidak valid'], 422);
    }

    // Simpan langsung ke kolom database
    $izin->tanda_tangan_user = $signatureData;
    $izin->save();

    return response()->json(['success' => true, 'message' => 'Tanda tangan berhasil disimpan!']);
}

}