<?php

class KorwilUserBpkpProvinsiController extends BaseController
{
    public function setProvinsi($user_id)
    {
        $this->checkScopes(['korsupgah.admin']);

        $rawBody = $this->request->getJsonRawBody(true);

        $params = $this->validate(
            $rawBody,
            [
                'provinsi_id' => ['validators' => ['required']]
            ]
        );

        $data = KorwilUserBpkpProvinsi::findFirst([
            'conditions' => 'user_id = ?0',
            'bind' => [
                $user_id
            ]
        ]);

        if(empty($data)) {
            $data = new KorwilUserBpkpProvinsi();
        }

        $data->user_id = $user_id;
        $data->provinsi_id = $params['provinsi_id'];
        $data->save();


        return new CollectionPaginatedResponse([$data]);
    }
    public function list() {
        $this->checkIsAuthenticated();

        $getParams = $this->request->get();

        $getParams['limit'] = $this->getDefaultLimit($getParams);
        $getParams['offset'] = array_key_exists('offset', $getParams) ? $getParams['offset'] : 0;
        $getParams['keyword'] = array_key_exists('keyword', $getParams) ? $getParams['keyword'] : '';

        $params =  $this->validate(
            $getParams,
            [
                'limit' => ['validators' => ['digit']],
                'offset' => ['validators' => ['digit']],
                'keyword' => ['validators' => []]
            ]
        );

        $data = KorwilUserBpkpProvinsi::find([
            'limit' => $params['limit'],
            'offset' => $params['offset']
        ]);

        $result = [];

        foreach ($data as $item) {
            $itemResult = $item->toArray();
            $itemResult['user_data'] = $item->umUser->toArraySimple();
            $itemResult['provinsi_data'] = $item->masterProvinsi->toArray();
            array_push($result, $itemResult);
        }

        $total_record = Jabatan::count();

        return new PaginatedResponse($result, $total_record, $params['limit'], $params['offset']);
    }

    public function listUserBpkp() {
        $this->checkIsAuthenticated();

        $role = Roles::findFirst([
            'conditions' => 'name = ?0',
            'bind' => [
                'korwil_bpkp'
            ]
        ]);

        $userids = array_column(
            UsersRoles::find([
                'conditions' => 'role_id = ?0',
                'bind' => [
                    $role->id
                ]
            ])->toArray(),
            "user_id"
        );

        $result = [];
        if(count($userids) > 0) {
            $users = UmUser::find([
                'columns' => 'um_id, um_user_name, nama, foto,uuid_user,is_banned,jenis_kelamin',
                'conditions' => 'um_id IN ({user_id:array}) and is_active = true',
                'bind' => [
                    'user_id' => array_values($userids)
                ]
            ]);

            $userProvinsi = KorwilUserBpkpProvinsi::find();
            $keyValuesUserProvinsi = [];
            foreach ($userProvinsi as $item) {
                $keyValuesUserProvinsi[$item->user_id] = $item->masterProvinsi->toArray();
            }


            foreach ($users as $user) {
                $itemResult = $user->toArray();
                $itemResult['provinsi'] = null;
                if (array_key_exists($user->um_id, $keyValuesUserProvinsi)) {
                    $itemResult['provinsi'] = $keyValuesUserProvinsi[$user->um_id];
                }
                array_push($result, $itemResult);
            }
        }

        return new CollectionPaginatedResponse($result);
    }

    public function getDetailProvinsi($user_id)
    {
        $this->checkIsAuthenticated();

        $data = KorwilUserBpkpProvinsi::findFirst([
            'conditions' => 'user_id = ?0',
            'bind' => [
                $user_id
            ]
        ]);

        if(empty($data)) throw new ValidationException("Data tidak ditemukan!");

        $result = MasterProvinsi::findFirst([
            'conditions' => 'provinsi_code = ?0',
            'bind' => [
                $data->provinsi_id
            ]
        ]);

        return new CollectionPaginatedResponse([$result]);
    }
}
