<?php

class JabatanController extends BaseController
{
    public function listJabatanKemdagri() {
        $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' => []]
            ]
        );

        $template_list = Jabatan::find([
            'conditions' => 'nama ilike :keyword: AND code ilike :code: AND deleted_at IS NULL',
            'bind' => [
                'keyword' => '%' . $params['keyword'] . '%',
                'code' => 'kemdagri_%',
            ],
            'limit' => $params['limit'],
            'offset' => $params['offset']
        ]);

        $total_record = Jabatan::count([
            'conditions' => 'code ilike :code: AND deleted_at IS NULL',
            'bind' => [
                'code' => 'kemdagri_%',
            ]
        ]);

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

    public function detail($id)
    {
        $this->checkIsAuthenticated();

        $data = Jabatan::findFirst($id);

        if (empty($data)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Jabatan tidak ditemukan');
        }

        return new CollectionPaginatedResponse([$data]);
    }



    public function create()
    {
        $this->checkScopes(['korsupgah.admin']);

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

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

        //validate if code already exist
        if(Jabatan::count([
            'conditions' => 'code = ?0 AND deleted_at IS NULL',
            'bind' => [$params['code']]
            ]) > 0)
            throw new ValidationException("Code already used!");

        $data = new Jabatan();
        $data->nama = $params['nama'];
        $data->code = $params['code'];
        $status = $data->save();

        if (!$status) {
            $errors = $data->getMessages();
            $error_messages = [];
            foreach ($errors as $key => $error) :
                $error_messages[] = [
                    "field" => $error->getField(),
                    "message" => $error->getMessage()
                ];
            endforeach;

            throw new ValidationException($error_messages);
        } else {
            return new CollectionPaginatedResponse([$data]);
        }
    }

    public function update($id)
    {
        $this->checkScopes(['korsupgah.admin']);

        $data = Jabatan::findFirst($id);

        if (empty($data))
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Jabatan dengan ID #' . $id . 'tidak ditemukan');

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

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

        //validate if code already exist
        if(Jabatan::count([
                'conditions' => 'code = ?0 AND id <> ?1',
                'bind' => [
                    $params['code'],
                    $id
                ]
            ]) > 0)
            throw new ValidationException("Code already used!");

        $data->nama = $params['nama'];
        $data->code = $params['code'];
        $status = $data->save();

        if (!$status) {
            $errors = $data->getMessage();
            $error_messages = [];
            foreach ($errors as $key => $error) :
                $error_messages[] = [
                    "field" => $error->getField(),
                    "message" => $error->getMessage()
                ];
            endforeach;

            throw new ValidationException($error_messages);
        } else {

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

    public function delete($id)
    {
        $this->checkScopes(['korsupgah.admin']);

        $data = Jabatan::findFirst($id);

        if (empty($data))
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Jabatan dengan ID #' . $id . 'tidak ditemukan');

        $data->deleted_at = date('Y-m-d H:i:s');
        $status = $data->save();

        if (!$status) {
            $errors = $data->getMessage();
            $error_messages = [];
            foreach ($errors as $key => $error) :
                $error_messages[] = [
                    "field" => $error->getField(),
                    "message" => $error->getMessage()
                ];
            endforeach;

            throw new ValidationException($error_messages);
        } else {

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

    public function setJabatanForUser($userid)
    {
        $this->checkScopes(['korsupgah.admin']);

        $data = UmUser::findFirst($userid);

        if (empty($data))
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'User dengan ID #' . $userid . 'tidak ditemukan');

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

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

        $data->id_jabatan = $params['id_jabatan'];
        $status = $data->save();

        if (!$status) {
            $errors = $data->getMessage();
            $error_messages = [];
            foreach ($errors as $key => $error) :
                $error_messages[] = [
                    "field" => $error->getField(),
                    "message" => $error->getMessage()
                ];
            endforeach;

            throw new ValidationException($error_messages);
        } else {

            return new CollectionPaginatedResponse([$data->toArraySimple()]);
        }
    }

    public function setUsersForJabatan($idjabatan)
    {
        $this->checkScopes(['korsupgah.admin']);

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

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

        $arrIdUsers = json_decode($params['id_users']);
        $users = UmUser::find([
            'columns' => 'um_id, id_jabatan',
            'conditions' => 'um_id IN ({userids:array})',
            'bind' => [
                'userids' => array_values($arrIdUsers)
            ]
        ]);

        $lastSavedUser = [];
        foreach ($users as $user) {
            $dataUser = UmUser::findFirst($user->um_id);
            $dataUser->id_jabatan = $idjabatan;
            $dataUser->save();
            $lastSavedUser = $user;
        }

        return new CollectionPaginatedResponse([$lastSavedUser]);

    }

    public function listUserFromJabatan($id_jabatan) {
        $this->checkIsAuthenticated();

        $result = UmUser::find([
            'columns' => 'um_id, um_user_name, nama, foto, uuid_user,is_banned,jenis_kelamin',
            'conditions' => 'id_jabatan = ?0 and is_active = true',
            'bind' => [
                $id_jabatan
            ]
        ]);


        return new CollectionPaginatedResponse($result);
    }

    public function listAllWithAreaFokus() {
        $this->checkIsAuthenticated();
        $selectQuery = $this->rawQuery("
            SELECT id_jabatan, 
            nama AS nama_jabatan,
            array_agg(id_area_fokus ORDER BY id_area_fokus) AS id_area_list,
            array_agg(title::text ORDER BY id_area_fokus) AS area_list
            FROM jaga.korsupgah_area_fokus_penanggung_jawab JOIN jaga.korsupgah_area_fokus
            ON korsupgah_area_fokus.id = korsupgah_area_fokus_penanggung_jawab.id_area_fokus
            JOIN jaga.jabatan
            ON jabatan.id = korsupgah_area_fokus_penanggung_jawab.id_jabatan
            GROUP BY id_jabatan, nama"
        );
        return new SimpleResponse($selectQuery);
    }
}
