<?php

class KorwilAnggaranTemplateController extends BaseController
{

    public function list()
    {

        $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'] : '';
        $getParams['order_by'] = array_key_exists('order_by', $getParams) ? $getParams['order_by'] : 'id';
        $getParams['order_direction'] = array_key_exists('order_direction', $getParams) ? $getParams['order_direction'] : 'asc';

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

        $q = [
            'conditions' => ['name ilike ' . '%' . $params['keyword'] . '%'],
            'sort' => ['id' => -1],
            'limit' => $params['limit'],
            'offset' => $params['offset']
        ];


        // $kp = KorwilAnggaranTemplate::find($q);   
        $kp = $this->modelsManager->createBuilder()
            ->from('KorwilAnggaranTemplate')
            ->where('name ilike :key:', ['key' => '%' . $params['keyword'] . '%'])
            ->limit($params['limit'], $params['offset'])
            ->orderBy($getParams['order_by'] . ' ' . $getParams['order_direction'])
            ->getQuery()
            ->execute();

        $total_record = KorwilAnggaranTemplate::count();

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

    public function create()
    {
        // $this->checkScopes(['korsupgah.admin']);
        $rawBody = $this->request->getJsonRawBody(true);
        $params = $this->validate(
            $rawBody,
            [
                'name' => ['validators' => ['required']],
                'template' => ['validators' => []],
                'id_sub_indikator' => ['validators' => ['numeric']],
            ]
        );

        $kp = new KorwilAnggaranTemplate();
        $kp->name = $params['name'];
        $kp->template = json_encode($params['template']);
        $kp->id_sub_indikator = $params['id_sub_indikator'];
        $kp->created_at = date('Y-m-d H:i:s');
        // $kp->created_by = $this->shared->user->um_id;

        $status = $kp->save();

        if (!$status) {
            $errors = $kp->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([$kp]);
        }
    }

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

        $kp = KorwilAnggaranTemplate::findFirst($id);

        if (empty($kp)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'id' . $id . 'tidak ditemukan');
        endif;

        if (!empty($kp->deleted_at)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'id ' . $id  . 'sudah terhapus');
        endif;

        $rawBody = $this->request->getJsonRawBody(true);
        $params = $this->validate(
            $rawBody,
            [
                'name' => ['validators' => ['required']],
                'template' => ['validators' => []],
                'id_sub_indikator' => ['validators' => ['numeric']],
            ]
        );

        $kp->name = $params['name'];
        $kp->template = json_encode($params['template']);
        $kp->id_sub_indikator = $params['id_sub_indikator'];
        $kp->updated_at = date('Y-m-d H:i:s');
        // $kp->updated_by = $this->shared->user->um_id;
        $status = $kp->save();

        if (!$status) {
            $errors = $kp->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([$kp]);
        }
    }

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

        $kp = KorwilAnggaranTemplate::findFirst($id);

        if (empty($kp)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'id' . $id . 'tidak diketemukan');
        endif;
        if (!empty($kp->deleted_at)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'id' . $id . 'sudah terhapus');
        endif;

        $date = date('Y-m-d H:i:s');
        $kp->updated_at = $date;
        $kp->deleted_at = $date;
        // $kp->updated_by = $this->shared->user->um_id;
        $status = $kp->save();

        if (!$status) {
            $errors = $kp->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([$kp]);
        }
    }

    public function restore($id)
    {
        // $this->checkScopes(['korsupgah.admin']);
        $kp = KorwilAnggaranTemplate::findFirst($id);

        if (empty($kp)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'id' . $id . 'tidak diketemukan');
        endif;
        if (empty($kp->deleted_at)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'id' . $id . 'Sudah Aktif');
        endif;

        $date = date('Y-m-d H:i:s');
        $kp->updated_at = $date;
        $kp->deleted_at = null;
        // $kp->updated_by = $this->shared->user->um_id;
        $status = $kp->save();

        if (!$status) {
            $errors = $kp->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([$kp]);
        }
    }

    public function detail($id)
    {

        $kp = KorwilAnggaranTemplate::findFirst($id);
        if (empty($kp)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'id' . $id . 'tidak ditemukan');
        endif;

        $result = $kp->toDetail();
        return new CollectionPaginatedResponse([$result]);
    }

    public function detailSub($id)
    {

        $kp = KorwilAnggaranTemplate::findFirst('id_sub_indikator = ' . $id);
        if (empty($kp)) :
            // throw new CustomErrorException(BaseResponse::INVALID_REQUEST, ' id ' . $id . ' tidak ditemukan');
            return new CollectionPaginatedResponse([]);
        endif;

        $result = $kp->toDetail();
        return new CollectionPaginatedResponse([$result]);
    }
}
