<?php

class TagsController 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'] : '';

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

        $mw = Tags::find([
            'conditions' => 'label ilike :keyword: AND deleted_at IS NULL',
            'bind' => [
                'keyword' => '%' . $params['keyword'] . '%'
            ],
            'limit' => $params['limit'],
            'offset' => $params['offset']
        ]);

        $total_record = Tags::count();

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

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

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

        $params = $this->validate(
            $rawBody,
            [
                'label' => ['validators' => [
                    'required',
                    [
                        'name' => 'max_string',
                        'params' => 30
                    ]
                ]]
            ]
        );

        $tag = new Tags();
        $tag->label = $params['label'];
        $tag->created_at = date('Y-m-d H:i:s');
        $status = $tag->save();

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

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

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

        $params = $this->validate(
            $rawBody,
            [
                'label' => ['validators' => [
                    'required',
                    [
                        'name' => 'max_string',
                        'params' => 30
                    ]
                ]]
            ]
        );

        $tag = Tags::findFirst($id);

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

        if (!empty($tag->deleted_at)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Tag sudah terhapus');
        }

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

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

    public function detail($id)
    {
        $tag = Tags::findFirst($id);

        if (empty($tag) || !empty($tag->deleted_at) || $tag->deleted_at != null) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Tag tidak ditemukan');
        }

        $result = $tag->toArray();

        return new CollectionPaginatedResponse([$result]);
    }

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

        $tag = Tags::findFirst($id);

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

        if (!empty($tag->deleted_at)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Tag sudah terhapus');
        }

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

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