<?php

class AppConfigController extends BaseController
{
    public function index()
    {
        $this->checkScopes(['admin.view']);
        $rawParams = $this->request->get();
        $rawParams['limit'] = $this->getDefaultLimit($rawParams);
        $rawParams['offset'] = array_key_exists('offset', $rawParams) ? $rawParams['offset'] : 0;

        $validatedParams = $this->validate($rawParams, [
            'limit' => ['validators' => [
                'required', 'digit'
            ]],
            'offset' => ['validators' => [
                'required', 'digit'
            ]],
            'keyword' => ['validators' => [
                [
                    'name' => 'max_string',
                    'params' => 100
                ]
            ]]
        ]);

        $query = [
            'conditions' => 'kode ILIKE :keyword: OR keterangan ILIKE :keyword:',
            'bind' => [
                'keyword' => '%' . $validatedParams['keyword'] . '%'
            ]
        ];
        $total = AppConfig::count($query);
        $query['limit'] = $validatedParams['limit'];
        $query['offset'] = $validatedParams['offset'];
        $rows = AppConfig::find($query);

        return new PaginatedResponse($rows, $total, $query['limit'], $query['offset']);
    }

    public function detail($id)
    {
        $this->checkScopes(['admin.view']);
        $row = AppConfig::findFirst($id);
        if (!$row) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Data tidak ditemukan");
        }

        return new SimpleResponse($row);
    }

    public function update($id) {
        $this->checkScopes(['admin.view']);
        /** @var $row AppConfig */
        $row = AppConfig::findFirst($id);
        if (!$row) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Data tidak ditemukan");
        }

        $rawParams = $this->request->getJsonRawBody(true);
        $validatedParams = $this->validate($rawParams, [
            'nilai' => ['validators' => [
                'required',
                [
                    'name' => 'max_string',
                    'params' => 255
                ]
            ]],
            'keterangan' => ['validators' => [
                'required',
                [
                    'name' => 'max_string',
                    'params' => 255
                ]
            ]]
        ]);

        $row->nilai = $validatedParams['nilai'];
        $row->keterangan = $validatedParams['keterangan'];
        $row->updated_at = DateHelper::getNowTimezoned();
        if (!$row->save()) {
            $this->throwObjectValidationException($row);
        }

        return new SimpleResponse($row);
    }

    public function updateKode($id) {
        $this->checkScopes(['admin.view']);
        /** @var $row AppConfig */
        $row = AppConfig::findFirst($id);
        if (!$row) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Data tidak ditemukan");
        }

        $rawParams = $this->request->getJsonRawBody(true);
        $validatedParams = $this->validate($rawParams, [
            'kode' => ['validators' => [
                'required',
                [
                    'name' => 'max_string',
                    'params' => 100
                ]
            ]]
        ]);

        $row->kode = $validatedParams['kode'];
        $row->updated_at = DateHelper::getNowTimezoned();
        if (!$row->save()) {
            $this->throwObjectValidationException($row);
        }

        return new SimpleResponse($row);
    }

    public function findByKode($kode) {
        $result = AppConfig::findByKode($kode);
        if (!$result->is_public) {
            $this->checkScopes(['admin.view']);
        }
        $nilai = $result->nilai;
        try{
            if ($this->isJson($nilai)) {
                $result->nilai = json_decode($nilai);
            }
        } catch (\Exception $e){
            $result->nilai = $nilai;
        }
        return new SimpleResponse($result);
    }

    private function isJson($string) {
        json_decode($string);
        return json_last_error() === JSON_ERROR_NONE;
    }
}
