<?php

use Phalcon\Validation;
use Phalcon\Validation\Validator\Email as EmailValidator;
use Jaga\Traits\ThrowableModel;

class Roles extends \Phalcon\Mvc\Model
{
    public $id;
    public $name;
    public $label;
    public $description;
    public $created_at;
    public $updated_at;
    public $deleted_at;

    const KORWIL_KLOP_ROLES = ['admin_korsupgah', 'admin_klop_korsupgah', 'admin_komunitas_korsupgah', 'observer_korsupgah', 'verifikator_korsupgah', 'observer_bansos', 'admin_bansos_korwil', 'admin_bansos_klop', 'verifikator_kemdagri_bpkp', 'admin_user_korsupgah', 'admin_klop_pad', 'admin_klop_aset', 'korwil_kemdagri', 'pic_korsup', 'qa_korsup'];
    const ROLE_PANCEK_VERIFIKATOR_KPPBC = 'verifikator_kppbc_pancek';
    const ROLE_PANCEK_ASSIGNOR_KPPBC = 'assignor_kppbc_pancek';
    const ROLE_PENGGUNA = 'pengguna';

    use ThrowableModel;

    /**
     * Initialize method for model.
     */
    public function initialize()
    {
        $this->setSchema("jaga");
        $this->setSource("roles");
        $this->hasMany('id', 'UsersRoles', 'role_id');
        $this->hasMany('id', 'RolesScopes', 'role_id');
        $this->hasManyToMany(
            'id',
            'RolesScopes',
            'role_id',
            'scope_id',
            'Scopes',
            'id'
        );
        $this->hasManyToMany(
            'id',
            'UsersRoles',
            'role_id',
            'user_id',
            'UmUser',
            'um_id'
        );
    }

    /**
     * Returns table name mapped in the model.
     *
     * @return string
     */
    public function getSource()
    {
        return 'roles';
    }

    public static function getAdminUserIds()
    {
        $adminRole = self::find(3)[0];
        $adminUsers = $adminRole->umUser;
        $ids = [];

        foreach ($adminUsers as $key => $admin) {
            $ids[] = $admin->um_id;
        }

        return $ids;
    }

    public function toDetail()
    {
        $result = $this->toArray();

        $result['aksi_list'] = $this->scopes;

        return $result;
    }

    public static function getUserRoleIds($roles) {
        if (!is_array($roles)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Roles tidak valid");
        }
        $users_roles = Roles::find([
            'conditions' => 'name in ({roles:array})',
            'columns' => 'id',
            'bind' => [
                'roles' => $roles
            ]
        ])->toArray();

        $user_roles_ids = [];
        foreach ($users_roles as $key => $role) {
            array_push($user_roles_ids, $role['id']);
        }

        return $user_roles_ids;
    }

    public static function getIdByRole($role) {
        $data = Roles::findFirst([
            'conditions' => 'name = :role:',
            'bind' => [
                'role' => $role
            ]
        ]);

        if(!$data) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Role tidak ditemukan!");
        }

        return $data->id;
    }

    public static function getRoleIdPengguna() {

        return self::getIdByRole(self::ROLE_PENGGUNA);
    }
}
