<?php

class KorsupgahAreaIntervensiController extends BaseController
{

    public function list()
    {
        $this->checkIsAuthenticated();

        $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' => []]
            ]
        );

        $kai_list = KorsupgahAreaIntervensi::find([
            'conditions' => 'nama ilike :keyword: or keterangan ilike :keyword:',
            'bind' => [
                'keyword' => '%' . $params['keyword'] . '%'
            ],
            'limit' => $params['limit'],
            'offset' => $params['offset']
        ]);

        $total_record = KorsupgahAreaIntervensi::count();

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

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

        $rawBody = $this->request->getJsonRawBody(true);
        $params = $this->validate(
            $rawBody,
            [
                'nama' => ['validators' => ['required']],
                'keterangan' => ['validators' => []],
                'presentase_bobot' => ['validators' => ['required', 'digit']],
                'presentase_bobot_wo_dana_desa' => ['validators' => ['digit']],
                'kategori_area_intervensi' => ['validators' => ['required', 'digit']],
                'id_area_fokus' => ['validators' => ['required', 'digit']],
            ]
        );

        if ($params['presentase_bobot'] > 100 || (array_key_exists('presentase_bobot_wo_dana_desa', $params) && $params['presentase_bobot_wo_dana_desa'] > 100)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Nilai valid hanya 0-100');
        }

        if ($params['kategori_area_intervensi'] != 0 && $params['kategori_area_intervensi'] != 1) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Kategori tidak valid');
        }

        $kai = new KorsupgahAreaIntervensi();
        $kai->nama = $params['nama'];
        $kai->keterangan = $params['keterangan'];
        $kai->presentase_bobot = $params['presentase_bobot'];
        $kai->presentase_bobot_wo_dana_desa = array_key_exists('presentase_bobot_wo_dana_desa', $rawBody) ? $params['presentase_bobot_wo_dana_desa'] : $params['presentase_bobot'];
        $kai->kategori_area_intervensi = $params['kategori_area_intervensi'];
        $kai->id_area_fokus = $params['id_area_fokus'];
        $kai->created_at = date('Y-m-d H:i:s');
        $kai->created_by = $this->shared->user->um_id;
        $status = $kai->save();
        if (!$status) {
            $errors = $kai->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([$kai]);
        }
    }

    public function update($id)
    {
        $this->checkScopes(['korsupgah.admin']);
        $kai = KorsupgahAreaIntervensi::findFirst($id);

        if (empty($kai)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Area intervensi dengan id' . $id . 'tidak ditemukan');
        endif;

        if (!empty($kai->deleted_at)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Area intervensi dengan id ' . $id  . 'mungkin sudah terhapus');
        endif;

        $rawBody = $this->request->getJsonRawBody(true);
        $params = $this->validate(
            $rawBody,
            [
                'nama' => ['validators' => ['required']],
                'keterangan' => ['validators' => []],
                'presentase_bobot' => ['validators' => ['required', 'digit']],
                'presentase_bobot_wo_dana_desa' => ['validators' => ['digit']],
                'kategori_area_intervensi' => ['validators' => ['required', 'digit']],
                'id_area_fokus' => ['validators' => ['required', 'digit']],
      ]
        );

        if ($params['presentase_bobot'] > 100 || (array_key_exists('presentase_bobot_wo_dana_desa', $rawBody) && $rawBody['presentase_bobot_wo_dana_desa'] > 100)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Nilai valid hanya 0-100');
        }

        if ($params['kategori_area_intervensi'] != 0 && $params['kategori_area_intervensi'] != 1) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Kategori tidak valid');
        }

        $kai->nama = $params['nama'];
        $kai->keterangan = $params['keterangan'];
        $kai->presentase_bobot = $params['presentase_bobot'];
        $kai->presentase_bobot_wo_dana_desa = array_key_exists('presentase_bobot_wo_dana_desa', $rawBody) ? $params['presentase_bobot_wo_dana_desa'] : $params['presentase_bobot'];
        $kai->kategori_area_intervensi = $params['kategori_area_intervensi'];
        $kai->id_area_fokus = $params['id_area_fokus'];
        $kai->updated_at = date('Y-m-d H:i:s');
        $kai->updated_by = $this->shared->user->um_id;;
        $status = $kai->save();

        if (!$status) {
            $errors = $kai->getMessage();
            $error_messages = [];
            foreach ($errors as $err) :
                $error_messages[] = [
                    'field' => $err->getField(),
                    'message' => $err->getMessage()
                ];
            endforeach;

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

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

        $kai = KorsupgahAreaIntervensi::findFirst($id);
        if (empty($kai)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Area intervensi dengan id' . $id . 'tidak diketemukan');
        endif;
        if (!empty($kai->deleted_at)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Area intervensi dengan id' . $id . 'mungkin sudah terhapus');
        endif;

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

        if (!$status) {
            $errors = $kai->getMessage();
            $error_messages = [];
            foreach ($errors as $err) :
                $error_messages[] = [
                    'field' => $err->getField(),
                    'message' => $err->getMessage()
                ];
            endforeach;
        } else {
            return new CollectionPaginatedResponse([$kai]);
        }
    }

    public function restore($id)
    {
        $this->checkScopes(['korsupgah.admin']);
        $kai = KorsupgahAreaIntervensi::findFirst($id);
        if (empty($kai)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Area intervensi dengan id' . $id . 'tidak diketemukan');
        endif;
        if (empty($kai->deleted_at)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Area intervensi dengan id' . $id . 'sudah aktif');
        endif;

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

        if (!$status) {
            $errors = $kai->getMessage();
            $error_messages = [];
            foreach ($errors as $err) :
                $error_messages[] = [
                    'field' => $err->getField(),
                    'message' => $err->getMessage()
                ];
            endforeach;
        } else {
            return new CollectionPaginatedResponse([$kai]);
        }
    }

    public function detail($id)
    {
        $this->checkIsAuthenticated();

        $kai = KorsupgahAreaIntervensi::findFirst($id);
        if (empty($kai)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Area intervensi dengan id' . $id . 'tidak diketemukan');
        endif;

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

    public function listByYear($year) {
        $this->checkIsAuthenticated();
        $getParams = $this->request->get();

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

        $kai_list = KorsupgahAreaIntervensi::find([
            'conditions' => 'nama ilike :keyword: AND keterangan ilike :year: ',
            'bind' => [
                'keyword' => '%' . $params['keyword'] . '%',
                'year' => '%' . $year . '%',
            ]
        ]);

        return new SimpleResponse($kai_list);
    }
}
