<?php

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

        $allowed_order = [
            'id',
            'nama'
        ];
        $allowed_order_direction = ['asc', 'desc'];

        $params =  $this->validate(
            $getParams,
            [
                'limit' => ['validators' => ['digit']],
                'offset' => ['validators' => ['digit']],
                'keyword' => ['validators' => []],
                'order_by' => ['validators' =>  [[
                    'name' => 'inclusion_in',
                    'params' => $allowed_order
                ]]],
                'order_direction' => ['validators' =>  [[
                    'name' => 'inclusion_in',
                    'params' => $allowed_order_direction
                ]]]
            ]
        );

        $indikator_list = LitbangKajianSektor::find([
            'conditions' => 'nama ilike :keyword: and deleted_at is null',
            'bind' => [
                'keyword' => '%' . $params['keyword'] . '%'
            ],
            'limit' => $params['limit'],
            'offset' => $params['offset'],
            'order' => "{$params['order_by']} {$params['order_direction']}"
        ]);

        $total_record = LitbangKajianSektor::count(['conditions' => 'deleted_at is null']);

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

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

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

        $allowed_order = [
            'id',
            'nama'
        ];
        $allowed_order_direction = ['asc', 'desc'];

        $params =  $this->validate(
            $getParams,
            [
                'limit' => ['validators' => ['digit']],
                'offset' => ['validators' => ['digit']],
                'keyword' => ['validators' => []],
                'order_by' => ['validators' =>  [[
                    'name' => 'inclusion_in',
                    'params' => $allowed_order
                ]]],
                'order_direction' => ['validators' =>  [[
                    'name' => 'inclusion_in',
                    'params' => $allowed_order_direction
                ]]]
            ]
        );

        $indikator_list = LitbangKajianSektor::find([
            'conditions' => 'nama ilike :keyword:',
            'bind' => [
                'keyword' => '%' . $params['keyword'] . '%'
            ],
            'limit' => $params['limit'],
            'offset' => $params['offset'],
            'order' => "{$params['order_by']} {$params['order_direction']}"
        ]);

        $total_record = LitbangKajianSektor::count();

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

    public function detail($id)
    {
        $record = LitbangKajianSektor::findFirst([
            'conditions' => 'id = :id: AND deleted_at is null',
            'bind' => [
                'id' => $id
            ]
        ]);

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

        return new SimpleResponse([$record]);
    }

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

        $record = LitbangKajianSektor::findFirst([
            'conditions' => 'id = :id: AND deleted_at is null',
            'bind' => [
                'id' => $id
            ]
        ]);

        if (empty($record)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Sektor Tidak Ditemukan');
        }

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

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

        $record->nama = $params['nama'];
        $record->updated_at = date('Y-m-d H:i:s');
        $status = $record->save();

        if (!$status) {
            $errors = $record->getMessage();
            $error_messages = [];

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

            throw new ValidationsException($error_messages);
        } else {
            return new CollectionPaginatedResponse([$record]);
        }
    }

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

        $record = LitbangKajianSektor::findFirst([
            'conditions' => 'id = :id: AND deleted_at is null',
            'bind' => [
                'id' => $id
            ]
        ]);

        if (empty($record)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Sektor Tidak Ditemukan');
        }

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

        if (!$status) {
            $errors = $record->getMessages();
            $error_messages = [];

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

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

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

        $record = LitbangKajianSektor::findFirst([
            'conditions' => 'id = :id: AND deleted_at is not null',
            'bind' => [
                'id' => $id
            ]
        ]);

        if (empty($record)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Sektor Terhapus Tidak Ditemukan');
        }

        $now = date('Y-m-d H:i:s');
        $record->updated_at = $now;
        $record->deleted_at = null;
        $status = $record->save();

        if (!$status) {
            $errors = $record->getMessages();
            $error_messages = [];

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

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

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

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

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

        $record = new LitbangKajianSektor();
        $record->nama = $params['nama'];
        $record->created_at = date('Y-m-d H:i:s');
        $record->updated_at = date('Y-m-d H:i:s');
        $status = $record->save();

        if (!$status) {
            $errors = $record->getMessages();
            $error_messages = [];

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

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