<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request; 
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
use Yajra\DataTables\DataTables;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Crypt;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
use App\Http\Responses\ApiResponse;

class RolePermissionController extends Controller
{
  
  
   public function role(){
  
    return view('admin.role.role');
    
   } 
   
  public function roleData(Request $request)
{
    if ($request->ajax()) {
        $roles = Role::with('permissions')->get();  

        return DataTables::of($roles)
            ->addColumn('permissions', function ($role) {
                return implode(', ', $role->permissions->pluck('name')->toArray());
            })
            ->addColumn('actions', function ($role) {
                return '<a href="' . url('admin/roles/' . $role->id . '/edit') . '" class="btn btn-sm btn-primary me-2">Edit</a>' .
                       '<a href="javascript:void(0)" onclick="roleDelete(' . $role->id . ')" class="btn btn-sm btn-danger">Delete</a>';
            })
            ->rawColumns(['actions'])  
            ->make(true);
    }
}
   
   
       
       
       
      public function permission(){
  
    return view('admin.permission.permission');
    
   } 
   
          public function permissionCrete(Request $request)
      {
          try {
              if ($request->ajax()) {
                  $validated = $request->validate([
                      'name' => 'required|string|max:255',
                  ]);
      
                  $permission = Permission::create([
                      'name' => $validated['name'],
                  ]);
      
                  Log::info('Permission created successfully!', ['data' => $validated['name']]);
      
                  return response()->json([
                      'message' => 'Permission created successfully!',
                      'data' => $permission
                  ]);
              } 
              
              return view('admin.permission.permission-create');
      
          } catch (\Exception $e) {

              Log::error('Error while creating permission.', [
                  'error' => $e->getMessage(),
                  'request_data' => $request->all()
              ]);
      
              return response()->json([
                  'message' => $e->getMessage(),
                  'error' => $e->getMessage()
              ], 500);
          }
      } 
      
      
      public function permissionData(Request $request){  
       
        if ($request->ajax()) {
        $permissions = Permission::with('roles')->get(); 

        return DataTables::of($permissions)
            ->addColumn('roles', function ($permission) {
                return implode(', ', $permission->roles->pluck('name')->toArray());
            })
            ->addColumn('actions', function ($permission) {
                return '<a href="' . url('admin/permissions/' . $permission->id . '/edit') . '" class="btn btn-sm btn-primary me-2">Edit</a>' .
                       '<a href="javascript:void(0)" onclick="permissionDelete(' . $permission->id . ')" class="btn btn-sm btn-danger">Delete</a>';
            })
            ->rawColumns(['actions'])  
            ->make(true);     
    }
       
       }
      
            public function permissionEdit(Request $request, $id)
        {
            try {
                if ($request->ajax()) {
                    $validated = $request->validate([
                        'name' => 'required|string|max:255',
                    ]);
        
                    $permission = Permission::findOrFail($id);

                    $permission->update([
                        'name' => $validated['name'],
                    ]);
        
                    Log::info('Permission updated successfully!', ['data' => $validated['name']]);
        
                    return response()->json([
                        'message' => 'Permission updated successfully!',
                        'data' => $permission
                    ]);
                }

                $permission = Permission::findOrFail($id);
        
                return view('admin.permission.permission-edit', compact('permission'));
        
            } catch (\Exception $e) {
                Log::error('Error while editing permission.', [
                    'error' => $e->getMessage(),
                    'request_data' => $request->all()
                ]);
        
                return response()->json([
                    'message' => 'Error while editing permission.',
                    'error' => $e->getMessage()
                ], 500);
            }
        }
        
        

   public function permissionDelete($id)
{
    try { 
       
    
            $permission = Permission::findOrFail($id);

            $permission->delete();

            Log::info('Permission deleted successfully!', ['id' => $id]);

            return response()->json([
                'message' => 'Permission deleted successfully!',
            ]);
        

    } catch (\Exception $e) {
        Log::error('Error while deleting permission.', [
            'error' => $e->getMessage(),
            'request_data' => $request->all()
        ]);

        return response()->json([
            'message' => 'Error while deleting permission.',
            'error' => $e->getMessage()
        ], 500);
    }
}
 

   public function rolesDelete($id)
{
    try { 
       
    
            $role = Role::findOrFail($id);
  
            $role->delete(); 

            Log::info('Roles deleted successfully!', ['id' => $id]);

            return response()->json([
                'message' => 'Roles deleted successfully!',
            ]);
        

    } catch (\Exception $e) {
        Log::error('Error while deleting Roles.', [
            'error' => $e->getMessage(),
            'request_data' => $request->all()
        ]);

        return response()->json([
            'message' => 'Error while deleting Roles.',
            'error' => $e->getMessage()
        ], 500);
    }
}
 


public function rolesUpdate(Request $request, $roleId = null)
{
    try {
        if ($request->ajax()) {

            // Validate input
            $validated = $request->validate([
                'name' => 'required|string|max:255',
                'permissions' => 'nullable|array',
                'permissions.*' => 'exists:permissions,id', // Ensure permission IDs exist
            ]);

            // Update the role if $roleId exists, else create a new one
            if ($roleId) {
                $role = Role::findOrFail($roleId);  // Find the role by ID or fail
                $role->update(['name' => $validated['name']]);
            } else {
                $role = Role::create(['name' => $validated['name']]);
            }

            // Handle permissions
            if (!empty($validated['permissions'])) {
                // Ensure the permissions exist in the database
                $permissions = Permission::whereIn('id', $validated['permissions'])->get();
                if ($permissions->count() !== count($validated['permissions'])) {
                    // Handle case where some permissions don't exist
                    return response()->json([
                        'message' => 'Some permissions do not exist.',
                        'error' => 'Some permissions are invalid.',
                    ], 400);
                }

                // Sync permissions to the role
                $role->syncPermissions($permissions);
            }

            // Log success
            Log::info($roleId ? 'Role updated successfully!' : 'Role created successfully!', ['data' => $role]);

            return response()->json([
                'message' => $roleId ? 'Role updated successfully!' : 'Role created successfully!',
                'data' => $role
            ]);
        }

        // If not an AJAX request, load the edit view
        $permissions = Permission::all();

        if ($roleId) {
            $role = Role::with('permissions')->findOrFail($roleId);
            return view('admin.role.role-edit', compact('permissions', 'role'));
        }

        // Load the view for creating a new role
        return view('admin.role.role-edit', compact('permissions'));

    } catch (\Exception $e) {
        // Log the error
        Log::error('Error while creating or updating Role.', [
            'error' => $e->getMessage(),
            'request_data' => $request->all()
        ]);

        return response()->json([
            'message' => 'Failed to create or update role.',
            'error' => 'An unexpected error occurred.'
        ], 500);
    }
}


      
      
 public function rolesCrete(Request $request)
{
    try {
        if ($request->ajax()) {

            // Validate input
            $validated = $request->validate([
                'name' => 'required|string|max:255',
                'permissions' => 'nullable|array',
                'permissions.*' => 'exists:permissions,id', // Validate permission IDs
            ]);

            // Create a new role
            $role = Role::create(['name' => $validated['name']]);

            // Handle permissions
            if (!empty($validated['permissions'])) {
                // Ensure the permissions exist in the database
                $permissions = Permission::whereIn('id', $validated['permissions'])->get();
                if ($permissions->count() !== count($validated['permissions'])) {
                    // Handle case where some permissions don't exist
                    return response()->json([
                        'message' => 'Some permissions do not exist.',
                        'error' => 'Some permissions are invalid.',
                    ], 400);
                }

                // Sync permissions to the role
                $role->syncPermissions($permissions);
            }

            // Log success
            Log::info('Role created successfully!', ['data' => $role]);

            return response()->json([
                'message' => 'Role created successfully!',
                'data' => $role
            ]);
        }

        // If not an AJAX request, load the create view
        $permissions = Permission::all();
        return view('admin.role.role-create', compact('permissions'));

    } catch (\Exception $e) {
        // Log the error
        Log::error('Error while creating Role.', [
            'error' => $e->getMessage(),
            'request_data' => $request->all()
        ]);

        return response()->json([
            'message' => 'Failed to create role.',
            'error' => 'An unexpected error occurred.'
        ], 500);
    }
}
   
  

   

   
  
  }