<?php

class PancekJenisInstansiController extends BaseController
{
    public function list()
    {
        $getParams = $this->request->get();
        $getParams['keyword'] = array_key_exists('keyword', $getParams) ? $getParams['keyword'] : '';
        $getParams['limit'] = $this->getDefaultLimit($getParams);
        $getParams['offset'] = array_key_exists('offset', $getParams) ? $getParams['offset'] : 0;

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

        $conditions = "nama ilike :keyword: AND deleted_at IS NULL";
        $bind = [
            'keyword' => '%' . $params['keyword'] . '%'
        ];
        $records = PancekJenisInstansi::find([
            'conditions' => $conditions,
            'bind' => $bind,
            'limit' => $params['limit'],
            'offset' => $params['offset'],
            'order' => 'id ASC'
        ]);

        $total = PancekJenisInstansi::count([
            'conditions' => $conditions,
            'bind' => $bind
        ]);

        return new PaginatedResponse($records, $total, $params['limit'], $params['offset']);
    }

    public function detail($id)
    {
        /** @var $data PancekJenisInstansi */
        $data = PancekJenisInstansi::findFirst(['conditions' => 'id = :id:', 'bind' => ['id' => $id]]);
        if (!$data) throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Jenis Instansi tidak ditemukan");

        return new SimpleResponse($data);
    }

    public function create()
    {
        $this->checkOneOfScopes(['admin.view','pancek.admin']);
        $params = $this->validatePost();
        $data = new PancekJenisInstansi();
        $data->assign($params);
        if (!$data->save()) {
            $errors = $data->getMessages();
            $error_messages = [];

            foreach ($errors as $key => $error) {
                $error_messages[] = ["field" => $error->getField(), "message" => $error->getMessage()];
            }

            throw new ValidationException($error_messages);
        }

        return new SimpleResponse($data);
    }

    public function update($id)
    {
        $this->checkOneOfScopes(['admin.view','pancek.admin']);
        /** @var $data PancekJenisInstansi */
        $data = PancekJenisInstansi::findFirst(['conditions' => 'id = :id:', 'bind' => ['id' => $id]]);
        if (!$data) throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Jenis Instansi tidak ditemukan");

        $params = $this->validatePost();
        $data->assign($params);
        $data->updated_at = DateHelper::getNowTimezoned();
        if (!$data->save()) {
            $errors = $data->getMessages();
            $error_messages = [];

            foreach ($errors as $key => $error) {
                $error_messages[] = ["field" => $error->getField(), "message" => $error->getMessage()];
            }

            throw new ValidationException($error_messages);
        }

        return new SimpleResponse($data);
    }

    public function tipeFormulir()
    {
        return new SimpleResponse(PancekJenisInstansi::TIPE_FORMULIR);
    }

    private function validatePost()
    {
        $rawBody = $this->request->getJsonRawBody(true);
        return $this->validate($rawBody, [
            'nama' => ['validators' => [
                'required',
                [
                    'name' => 'max_string',
                    'params' => 255
                ]
            ]],
            'formulir_type' => ['validators' => [
                'required',
                [
                    'name' => 'inclusion_in',
                    'params' => PancekJenisInstansi::TIPE_FORMULIR
                ]
            ]]
        ]);
    }
}
