<?php

namespace App\Http\Controllers\Shared;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class UserController extends Controller
{
    /**
     * Helper untuk memvalidasi hak akses peran Admin Provinsi
     */
    private function validateAdminGuard()
    {
        $userId = session('simulasi_user_id', 1);
        $user = DB::table('users')->where('id', $userId)->first();
        
        if (!$user || $user->role !== 'provinsi_admin') {
            abort(403, 'Akses Ditolak! Halaman pengelolaan akses pengguna hanya diizinkan untuk Dinas Provinsi (Admin Provinsi).');
        }
    }

    /**
     * Tampilkan seluruh daftar pengguna.
     */
    public function index(Request $request)
    {
        $this->validateAdminGuard();
        
        $search = $request->input('search');
        $roleFilter = $request->input('role');

        $query = DB::table('users')
            ->leftJoin('regencies', 'users.regency_id', '=', 'regencies.id')
            ->select('users.*', 'regencies.nama_kabupaten');

        if ($search) {
            $query->where(function($q) use ($search) {
                $q->where('users.name', 'LIKE', '%' . $search . '%')
                  ->orWhere('users.email', 'LIKE', '%' . $search . '%')
                  ->orWhere('users.no_hp', 'LIKE', '%' . $search . '%');
            });
        }

        if ($roleFilter) {
            $query->where('users.role', $roleFilter);
        }

        $users = $query->orderBy('users.role', 'ASC')
            ->orderBy('users.name', 'ASC')
            ->get();

        $kabupatens = DB::table('regencies')->orderBy('nama_kabupaten', 'ASC')->get();

        return view('shared.user.index', compact('users', 'kabupatens'));
    }

    /**
     * Simpan pendaftaran akun operator baru.
     */
    public function store(Request $request)
    {
        $this->validateAdminGuard();

        $request->validate([
            'name' => 'required|string|max:150',
            'email' => 'required|email|unique:users,email',
            'no_hp' => 'nullable|string|max:20',
            'role' => 'required|in:provinsi_admin,provinsi_pejabat,kabupaten_user',
            'regency_id' => 'required_if:role,kabupaten_user|nullable|exists:regencies,id',
            'password' => 'required|string|min:6'
        ], [
            'email.unique' => 'Alamat email ini sudah terdaftar di sistem!',
            'regency_id.required_if' => 'Akun operator kabupaten wajib dikunci ke salah satu wilayah kabupaten!'
        ]);

        DB::table('users')->insert([
            'name' => $request->name,
            'email' => $request->email,
            'no_hp' => $request->no_hp,
            'role' => $request->role,
            'regency_id' => $request->role === 'kabupaten_user' ? $request->regency_id : null,
            'password' => Hash::make($request->password),
            'is_active' => true,
            'created_at' => now(),
            'updated_at' => now()
        ]);

        return redirect()->route('shared.user.index')->with('success', 'Akun pengguna baru sukses didaftarkan!');
    }

    /**
     * Perbarui data profil pengguna secara aman.
     */
    public function update(Request $request, int $id)
    {
        $this->validateAdminGuard();

        $request->validate([
            'name' => 'required|string|max:150',
            'email' => 'required|email|unique:users,email,' . $id,
            'no_hp' => 'nullable|string|max:20',
            'role' => 'required|in:provinsi_admin,provinsi_pejabat,kabupaten_user',
            'regency_id' => 'required_if:role,kabupaten_user|nullable|exists:regencies,id'
        ], [
            'email.unique' => 'Alamat email ini sudah terdaftar di sistem untuk pengguna lain!',
            'regency_id.required_if' => 'Akun operator kabupaten wajib dikunci ke salah satu wilayah kabupaten!'
        ]);

        DB::table('users')
            ->where('id', $id)
            ->update([
                'name' => $request->name,
                'email' => $request->email,
                'no_hp' => $request->no_hp,
                'role' => $request->role,
                'regency_id' => $request->role === 'kabupaten_user' ? $request->regency_id : null,
                'updated_at' => now()
            ]);

        return redirect()->route('shared.user.index')->with('success', 'Detail profil akun pengguna berhasil diperbarui!');
    }

    /**
     * Tangguhkan atau aktifkan kembali akun pengguna secara instan.
     */
    public function toggleStatus(int $id)
    {
        $this->validateAdminGuard();
        $user = DB::table('users')->where('id', $id)->first();

        if (!$user) {
            return back()->withErrors(['error' => 'Data pengguna tidak ditemukan.']);
        }

        if ($id == 1) {
            return back()->withErrors(['error' => 'Anda tidak diizinkan untuk menonaktifkan akun admin utama!']);
        }

        DB::table('users')->where('id', $id)->update([
            'is_active' => !$user->is_active,
            'updated_at' => now()
        ]);

        $statusText = !$user->is_active ? 'diaktifkan kembali' : 'ditangguhkan (suspend)';
        return redirect()->route('shared.user.index')->with('success', "Akun {$user->name} berhasil {$statusText}!");
    }

    /**
     * Reset sandi pengguna menjadi kata sandi default sistem.
     */
    public function resetPassword(int $id)
    {
        $this->validateAdminGuard();
        $user = DB::table('users')->where('id', $id)->first();

        if (!$user) {
            return back()->withErrors(['error' => 'Data pengguna tidak ditemukan.']);
        }

        $defaultPassword = 'pradipajaya';

        DB::table('users')->where('id', $id)->update([
            'password' => Hash::make($defaultPassword),
            'updated_at' => now()
        ]);

        return redirect()->route('shared.user.index')->with('success', "Kata sandi untuk {$user->name} berhasil di-reset menjadi default: '{$defaultPassword}'");
    }
}