<?php

class InstansiTipeController extends BaseController
{
    public function index()
    {
        $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['stranas_filter'] = array_key_exists('stranas_filter', $getParams) ? $getParams['stranas_filter'] : null;
        $getParams['order_by'] = $getParams['order_by'] ?? 'id';
        $getParams['order_direction'] = $getParams['order_direction'] ?? 'asc';

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

        $stranas_filter_condition = '';

        if (is_null($params['stranas_filter'])) {
            // No condition
        } else if ((int) $params['stranas_filter'] < 1) {
            $stranas_filter_condition = 'AND NOT stranas_filter';
        } else {
            $stranas_filter_condition = 'AND stranas_filter';
        }

        $instansi = InstansiTipe::find([
            'conditions' => "nama ilike :keyword: $stranas_filter_condition",
            'bind' => [
                'keyword' => '%' . $params['keyword'] . '%'
            ],
            'limit' => $params['limit'],
            'offset' => $params['offset'],
            'order' => '[InstansiTipe].'.$params['order_by'] . ' ' . $params['order_direction']
        ]);

        $total_record = InstansiTipe::count([
            'conditions' => "nama ilike :keyword: $stranas_filter_condition",
            'bind' => [
                'keyword' => '%' . $params['keyword'] . '%'
            ],
        ]);

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

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

        $instansi_tipe = InstansiTipe::findFirst($id);

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

        $result = $instansi_tipe->toDetail();

        return new CollectionPaginatedResponse([$result]);
    }

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

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

        $instansi_tipe = new InstansiTipe();
        $instansi_tipe->nama = $params['nama'];
        $instansi_tipe->stranas_filter = $params['stranas_filter'];
        $status = $instansi_tipe->save();
        if (!$status) {
            $errors = $instansi_tipe->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([$instansi_tipe]);
        }
    }

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

        $instansi_tipe = InstansiTipe::findFirst($id);
        if (empty($instansi_tipe)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'ID dengan ' . $id . ' tidak diketemukan');
        }

        if (!empty($instansi_tipe->deleted_at)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'ID dengan ' . $id . ' sudah terhapus');
        }

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

        $params =  $this->validate(
            $rawBody,
            [ // pls fix this
                // 'id_tipe' => ['validators' => ['required', 'digit']],
                // 'show_to_public' => ['validators' => ['digit']],
                // 'is_stranas' => ['validators' => ['digit']],
                'nama' => ['validators' => ['required']],
                'stranas_filter' => ['validators' =>  []]
                // 'flag_dana_desa' => ['validators' => ['digit']],
                // 'flag_pak' => ['validators' => []],
                // 'keluhan_type' => ['validators' =>  []]
            ]
        );

        $instansi_tipe->nama = $params['nama'];
        $instansi_tipe->stranas_filter = $params['stranas_filter'];
        // $instansi->id_tipe = $params['id_tipe'];
        // $instansi->show_to_public = $params['show_to_public'];
        // $instansi->is_stranas = $params['is_stranas'];
        // $instansi->updated_at = date('Y-m-d H:i:s');
        // $instansi->flag_dana_desa = $params['flag_dana_desa'];
        // $instansi->flag_pak = $params['flag_pak'];
        // $instansi->keluhan_type = $params['keluhan_type'];
        $status = $instansi_tipe->save();

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

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

        $instansi_tipe = InstansiTipe::findFirst($id);

        if (empty($instansi_tipe)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Tipe Instansi Tidak Ditemukan');
        }

        if (!empty($instansi_tipe->deleted_at)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Tipe Instansi Sudah Terhapus');
        }

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

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

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

        $instansi_tipe = InstansiTipe::findFirst($id);

        if (empty($instansi_tipe)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Instansi Tipe Tidak Ditemukan');
        }

        if (!empty(!$instansi_tipe->deleted_at)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Instansi Tipe Sudah Aktif');
        }

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

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