<?php

namespace App\Providers;

use App\Models\RolePermission;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array<class-string, class-string>
     */
    protected $policies = [
        // 'App\Models\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        //view managements
        Gate::define('view-managements', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);
            return count(array_intersect([
                "User.List",
                "Role.List",
                "Permission.List",
                "Profession.List"
            ], $rolePermissions)) > 0 ? true : false;
        });
        // users management
        Gate::define('list-users', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("User.List", $rolePermissions) ? true : false;
        });
        Gate::define('list-taglines', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Tagline.List", $rolePermissions) ? true : false;
        });
        Gate::define('create-taglines', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Tagline.Create", $rolePermissions) ? true : false;
        });
        Gate::define('update-taglines', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Tagline.Update", $rolePermissions) ? true : false;
        });
        Gate::define('delete-taglines', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Tagline.Delete", $rolePermissions) ? true : false;
        });
        Gate::define('view-taglines', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Tagline.View", $rolePermissions) ? true : false;
        });
        Gate::define('create-users', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("User.Create", $rolePermissions) ? true : false;
        });

        Gate::define('update-users', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("User.Update", $rolePermissions) ? true : false;
        });

        Gate::define('view-users', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("User.View", $rolePermissions) ? true : false;
        });

        Gate::define('delete-users', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("User.Delete", $rolePermissions) ? true : false;
        });

        // roles management
        Gate::define('list-roles', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Role.List", $rolePermissions) ? true : false;
        });

        Gate::define('create-roles', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Role.Create", $rolePermissions) ? true : false;
        });

        Gate::define('update-roles', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Role.Update", $rolePermissions) ? true : false;
        });

        Gate::define('view-roles', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Role.View", $rolePermissions) ? true : false;
        });

        Gate::define('delete-roles', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Role.Delete", $rolePermissions) ? true : false;
        });

        // permissions

        Gate::define('list-permissions', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Permission.List", $rolePermissions) ? true : false;
        });

        Gate::define('set-permissions', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Permission.Set", $rolePermissions) ? true : false;
        });

        Gate::define('update-permissions', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Permission.Update", $rolePermissions) ? true : false;
        });

        // professions
        Gate::define('list-professions', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Profession.List", $rolePermissions) ? true : false;
        });

        Gate::define('create-professions', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Profession.Create", $rolePermissions) ? true : false;
        });

        Gate::define('update-professions', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Profession.Update", $rolePermissions) ? true : false;
        });

        Gate::define('view-professions', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Profession.View", $rolePermissions) ? true : false;
        });

        Gate::define('delete-professions', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Profession.Delete", $rolePermissions) ? true : false;
        });
        //professionals
        Gate::define('list-professionals', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Professional.List", $rolePermissions) ? true : false;
        });
        Gate::define('review-professionals', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Professional.Review", $rolePermissions) ? true : false;
        });
        Gate::define('view-professionals', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Professional.View", $rolePermissions) ? true : false;
        });
        Gate::define('list-disbursements', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("Disbursement.List", $rolePermissions) ? true : false;
        });
        //View Configs
        Gate::define('view-configs', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);
            return count(array_intersect([
                "ConfigFee.View"
            ], $rolePermissions)) > 0 ? true : false;
        });
        // Config Fees
        Gate::define('view-config-fees', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("ConfigFee.View", $rolePermissions) ? true : false;
        });
        Gate::define('update-config-fees', function ($user) {

            $rolePermissions = $this->getRolePermissions($user->role_id);

            return in_array("ConfigFee.Update", $rolePermissions) ? true : false;
        });
    }

    public function getRolePermissions($roleId)
    {
        $modules = RolePermission::where('role_id', $roleId)->with('permission')->get();

        $rolePermissions = [];

        foreach ($modules as $access) {
            $rolePermissions[] = $access->permission->alias;
        }

        return $rolePermissions;
    }
}
