<?php

namespace App\Http\Controllers;

use App\Models\PengajuanMasjid;
use App\Models\Masjid;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;

class AuthController extends Controller
{
    /**
     * Menampilkan halaman login
     */
    public function showLogin()
    {
        return view('auth.login');
    }

    /**
     * Proses login: mencari user berdasarkan username (email),
     * lalu mencocokkan password yang sudah di-hash.
     */
    public function login(Request $request)
    {
        $request->validate([
            'email'    => 'required',
            'password' => 'required',
        ]);

        // Tentukan apakah input berupa email atau username
        $loginType = filter_var($request->email, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';

        // Auth::attempt menggunakan kolom yang sesuai
        if (Auth::attempt([$loginType => $request->email, 'password' => $request->password])) {
            $request->session()->regenerate();

            // Redirect berdasarkan role user
            $role = Auth::user()->int_role;

            return match ($role) {
                'superadmin'   => redirect('/superadmin/dashboard'),
                'admin_masjid' => redirect('/admin/dashboard'),
                'rt'           => redirect('/rt/dashboard'),
                'amil'         => redirect('/amil/dashboard'),
                default        => redirect('/login'),
            };
        }

        // Login gagal
        return back()->withErrors([
            'email' => 'Login gagal! Email/Username atau password salah.',
        ])->onlyInput('email');
    }

    /**
     * Proses logout
     */
    public function logout(Request $request)
    {
        Auth::logout();
        $request->session()->invalidate();
        $request->session()->regenerateToken();
        return redirect('/login');
    }

    /**
     * Menyimpan data pengajuan pendaftaran masjid baru (tanpa login)
     * Menggunakan model PengajuanMasjid (bukan DB::table raw query)
     */
    public function storePengajuan(Request $request)
    {
        $request->validate([
            'nama_masjid'      => 'required|string|max:255',
            'alamat_masjid'    => 'required|string',
            'nama_admin_masjid'=> 'required|string|max:255',
            'no_wa_admin'      => 'required|string|max:20',
            'username'         => 'required|string|max:50|unique:pengajuan_masjid,username',
            'email'            => 'required|email|max:255|unique:pengajuan_masjid,email',
            'password'         => 'required|string|min:6|confirmed',
            'latitude'         => 'nullable|numeric|between:-90,90',
            'longitude'        => 'nullable|numeric|between:-180,180',
        ], [
            'email.unique'       => 'Email ini sudah pernah digunakan untuk mendaftar.',
            'password.confirmed' => 'Konfirmasi password tidak cocok.',
        ]);

        PengajuanMasjid::create([
            'tanggal_pengajuan'  => now()->toDateString(),
            'nama_masjid'        => $request->nama_masjid,
            'alamat_masjid'      => $request->alamat_masjid,
            'latitude'           => $request->latitude ?: null,
            'longitude'          => $request->longitude ?: null,
            'nama_admin_masjid'  => $request->nama_admin_masjid,
            'no_wa_admin'        => $request->no_wa_admin,
            'username'           => $request->username,
            'email'              => $request->email,
            'password'           => Hash::make($request->password),
            'status_pengajuan'   => 'pending',
        ]);

        return redirect()->back()->with('success', 'Pengajuan pendaftaran masjid berhasil dikirim! Silakan tunggu verifikasi.');
    }

    /**
     * Superadmin menyetujui pengajuan masjid:
     * 1. Buat record Masjid baru
     * 2. Buat akun user admin_masjid baru
     * 3. Update status pengajuan menjadi 'disetujui'
     * 4. Siapkan data notifikasi WA
     */
    public function approveMasjid($id)
    {
        $pengajuan = PengajuanMasjid::findOrFail($id);

        // 1. Buat data masjid baru (sertakan koordinat jika tersedia)
        $masjid = Masjid::create([
            'nama_masjid'   => $pengajuan->nama_masjid,
            'alamat_masjid' => $pengajuan->alamat_masjid,
            'tahun_aktif'   => now()->year,
            'latitude'      => $pengajuan->latitude,
            'longitude'     => $pengajuan->longitude,
        ]);

        // 2. Buat akun admin masjid baru (username + email dipisah)
        User::create([
            'nama_user'    => $pengajuan->nama_admin_masjid,
            'username'     => $pengajuan->username,
            'email'        => $pengajuan->email,
            'password'     => $pengajuan->password, // Sudah di-hash saat storePengajuan
            'int_role'     => 'admin_masjid',
            'id_masjid'    => $masjid->id_masjid,
            'status_aktif' => true,
        ]);

        // 3. Update status pengajuan
        $pengajuan->update(['status_pengajuan' => 'disetujui']);

        // 4. Siapkan data notifikasi WA
        $noWa  = preg_replace('/[^0-9]/', '', $pengajuan->no_wa_admin);
        if (str_starts_with($noWa, '0')) $noWa = '62' . substr($noWa, 1);

        $pesan = "Assalamu'alaikum {$pengajuan->nama_admin_masjid},\n\n"
               . "✅ *Pengajuan Diterima!*\n\n"
               . "Pendaftaran *{$pengajuan->nama_masjid}* telah *disetujui* oleh Super Admin.\n\n"
               . "📋 *Detail Akun Login:*\n"
               . "• Username: {$pengajuan->username}\n"
               . "• Email: {$pengajuan->email}\n"
               . "• Password: (sesuai yang Anda daftarkan)\n\n"
               . "Silakan login di: " . url('/login') . "\n\n"
               . "Wassalamu'alaikum 🕌";

        return redirect()->back()
            ->with('success', "Masjid dan akun admin berhasil diverifikasi!")
            ->with('wa_notif', [
                'no_wa'   => $noWa,
                'nama'    => $pengajuan->nama_admin_masjid,
                'masjid'  => $pengajuan->nama_masjid,
                'status'  => 'disetujui',
                'pesan'   => $pesan,
                'wa_link' => 'https://wa.me/' . $noWa . '?text=' . rawurlencode($pesan),
            ]);
    }

    /**
     * Superadmin menolak pengajuan masjid:
     * Update status pengajuan menjadi 'ditolak'
     * Siapkan data notifikasi WA
     */
    public function rejectMasjid($id)
    {
        $pengajuan = PengajuanMasjid::findOrFail($id);
        $pengajuan->update(['status_pengajuan' => 'ditolak']);

        // Siapkan data notifikasi WA
        $noWa = preg_replace('/[^0-9]/', '', $pengajuan->no_wa_admin);
        if (str_starts_with($noWa, '0')) $noWa = '62' . substr($noWa, 1);

        $pesan = "Assalamu'alaikum {$pengajuan->nama_admin_masjid},\n\n"
               . "❌ *Pengajuan Tidak Disetujui*\n\n"
               . "Mohon maaf, pendaftaran *{$pengajuan->nama_masjid}* belum dapat disetujui saat ini.\n\n"
               . "Untuk informasi lebih lanjut, silakan hubungi Super Admin.\n\n"
               . "Terima kasih 🙏";

        return redirect()->back()
            ->with('success', "Pengajuan masjid telah ditolak.")
            ->with('wa_notif', [
                'no_wa'   => $noWa,
                'nama'    => $pengajuan->nama_admin_masjid,
                'masjid'  => $pengajuan->nama_masjid,
                'status'  => 'ditolak',
                'pesan'   => $pesan,
                'wa_link' => 'https://wa.me/' . $noWa . '?text=' . rawurlencode($pesan),
            ]);
    }

}