<?php

namespace App\Services;

use App\Libs\Consts\StatusConst;
use App\Repositories\Interfaces\RolePermissionRepositoryInterface;
use App\Repositories\Interfaces\RoleRepositoryInterface;

class RoleService
{

    protected $roleRepository;
    protected $rolePermissionRepository;

    public function __construct(RoleRepositoryInterface $roleRepository, RolePermissionRepositoryInterface $rolePermissionRepository)
    {
        $this->roleRepository = $roleRepository;
        $this->rolePermissionRepository = $rolePermissionRepository;
    }

    public function getAllRoles()
    {
        return $this->roleRepository->all();
    }

    public function storeRole($request)
    {

        $payload = [
            'role' => $request->get('role_name'),
            'description' => $request->get('description')
        ];

        $role = $this->roleRepository->create($payload);

        if ($request->has('permission')) {

            foreach ($request->get('permission') as $permission) {
                $access = [
                    'role_id' => $role->id,
                    'permission_id' => $permission
                ];

                $this->rolePermissionRepository->create($access);
            }
        }

        $response = [
            'status' => 'success',
            'message' => 'Success! The new role has been created.'
        ];

        return $response;
    }

    public function getRole($id)
    {
        $role = $this->roleRepository->find($id);
        $rolePermission = $this->rolePermissionRepository->getByRole($id);
        $permissions = [];
        $modules = [];

        foreach ($rolePermission as $permission) {
            $permissions[] = $permission->permission_id;
            $moduleName = $permission->permission->module->name;
            $modules[$moduleName][] = $permission->permission;
        }

        $role->permissionDetails = $modules;
        $role->access = $permissions;

        return $role;
    }

    public function updateRole($request, $roleId)
    {
        $payload = [
            'role' => $request->get('role_name'),
            'description' => $request->get('description')
        ];

        $this->roleRepository->update($payload, $roleId);

        if ($request->has('permission')) {

            $this->rolePermissionRepository->removePermission($roleId);

            foreach ($request->get('permission') as $permission) {
                $access = [
                    'role_id' => $roleId,
                    'permission_id' => $permission
                ];

                $this->rolePermissionRepository->create($access);
            }
        } else {
            $this->rolePermissionRepository->removePermission($roleId);
        }

        $response = [
            'status' => 'success',
            'message' => 'Success! The role has been updated.'
        ];

        return $response;;
    }

    public function removeRole($id)
    {
        $this->rolePermissionRepository->removePermission($id);
        return $this->roleRepository->delete($id);
    }

    public function listRoles()
    {
        return $this->roleRepository->getList();
    }

    public function checkIfNameIsAvailable($request)
    {
        $inputName = $request->get('role');
        $roleId = $request->get('id');

        $role = $this->roleRepository->getByColumn('role', $inputName);

        if (!empty($role)) {
            if ($role->id != $roleId) {
                return ['status' => StatusConst::BAD_REQUEST, 'message' => 'Role Name is already existing'];
            }
        }

        return ['status' => StatusConst::SUCCESS, 'message' => ''];
    }
}
