<?php

use Illuminate\Database\Seeder;
use App\Laravue\Models\Role;
use App\Laravue\Models\Permission;
use App\Laravue\Acl;
use App\RolePermission;

class ReloadPermission extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        /* Delete Ignore Permission */
        $listIgnore = Acl::permissionsIgnore();
        $ignorePermissionIds = Permission::whereIn('name', $listIgnore)->pluck('id');
        RolePermission::whereIn('permission_id', $ignorePermissionIds)->delete();
        Permission::whereIn('id', $ignorePermissionIds)->delete();

        /* Check Duplicate */
        $listPer = [];
        $perDelete = [];
        $allPermissions = Permission::all();
        foreach ($allPermissions as $itPer) {
            $perName = str_replace("-", "_", $itPer->name);
            if (!in_array($perName, $listPer)) {
                $listPer[] = $perName;
            } else {
                $perDelete[] = $itPer->id;
            }
        }
        if (count($perDelete) > 0) {
            RolePermission::whereIn('permission_id', $perDelete)->delete();
            Permission::whereIn('id', $perDelete)->delete();
        }

        /* Setup Roles */
        foreach (Acl::roles() as $role) {
            Role::findOrCreate($role);
        }

        $adminRole = Role::findByName(Acl::ROLE_ADMIN);
        $managerRole = Role::findByName(Acl::ROLE_MANAGER);
        $editorRole = Role::findByName(Acl::ROLE_EDITOR);
        $userRole = Role::findByName(Acl::ROLE_USER);
        $visitorRole = Role::findByName(Acl::ROLE_VISITOR);

        foreach (Acl::permissions() as $permission) {
            Permission::findOrCreate($permission, 'api');
        }

        // Setup basic permission
        $adminRole->givePermissionTo(Acl::permissions());
        $managerRole->givePermissionTo(Acl::permissions([Acl::PERMISSION_PERMISSION_MANAGE]));
        $editorRole->givePermissionTo(Acl::menuPermissions());
        $editorRole->givePermissionTo(Acl::PERMISSION_ARTICLE_MANAGE);
        $userRole->givePermissionTo(Acl::PERMISSION_VIEW_MENU_PERMISSION);
        $visitorRole->givePermissionTo(Acl::PERMISSION_VIEW_MENU_PERMISSION);
    }
}
