<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\RoleRequest;
use Illuminate\Support\Facades\Log;
use Inertia\Inertia;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class RoleController extends Controller
{

    public function __invoke(Request $request)
    {
        try {
            $kategori = Role::latest()->get();
            return Inertia::render('admin/kategori/index_kategori', ['kategori' => $kategori]);
        } catch (\Exception $e) {
            Log::error('Error fetching Kategori: ' . $e->getMessage());
            return back()->with('error', 'Something went wrong.');
        }
    }
    public function index()
    {
          $roles = Role::with('permissions')
            ->latest()
            ->paginate(10);

        // Kembalikan data ke komponen Inertia 'Admin/Roles/Index'
        return Inertia::render('admin/roles/index_roles', compact('roles'));
    }
    public function create()
{
    // Ambil semua permission
    $permissions = Permission::all();

    // Kembalikan ke Inertia 'Admin/Roles/Create' dengan data permissions
    return Inertia::render('admin/roles/create_roles', [
        'permissions' => $permissions,
    ]);
}

    public function store(RoleRequest $request)
    {
        // Validasi data input melalui RoleRequest
        $validatedData = $request->validated();

        // Buat role baru dengan data yang telah divalidasi
        $role = Role::create($validatedData);

        // Tetapkan permissions pada role yang baru dibuat
        $role->syncPermissions($request->input('permissions'));

        // Jika berhasil simpan, arahkan dengan pesan sukses, jika gagal dengan pesan error
        if ($role) {
            return redirect()->route('admin.roles.index')->with(['success' => 'Data Berhasil Disimpan!']);
        } else {
            return redirect()->route('admin.roles.index')->with(['error' => 'Data Gagal Disimpan!']);
        }
    }

    public function edit(Role $role)
    {
        // Ambil semua permission, diurutkan dari yang terbaru
        $permissions = Permission::latest()->get();

        // Ambil ID dari permissions yang dimiliki oleh role saat ini
        $rolePermissions = $role->permissions->pluck('id')->toArray();

        // Map permissions agar hanya menyertakan 'id' dan 'name'
        $permissions = $permissions->map(function ($permission) {
            return [
                'id' => $permission->id,
                'name' => $permission->name,
            ];
        });

        // Kembalikan data ke Inertia 'Admin/Roles/Edit' dengan data role, permissions, dan rolePermissions
        return Inertia::render('admin/roles/edit_roles', [
            'permissions' => $permissions,
            'role' => $role,
            'rolePermissions' => $rolePermissions,
        ]);
    }

    public function update(RoleRequest $request, Role $role)
    {
        // Update data role dengan data yang telah divalidasi
        $role->name = $request->name;

        // Sync permissions
        $role->permissions()->sync($request->permissions);

        // Simpan perubahan
        $role->save();

        // Arahkan kembali ke daftar role
        return redirect()->route('admin.roles.index')->with('success', 'Role updated successfully.');
    }

    public function destroy($id)
    {
        // Cari role berdasarkan ID, error jika tidak ditemukan
        $role = Role::findOrFail($id);

        // Hapus role dari database
        $role->delete();

        // Arahkan kembali dengan pesan bahwa role berhasil dihapus
        return redirect()->route('admin.roles.index')->with('message', 'Role deleted successfully.');
    }
}
