<?php

class LitbangSatgasController extends BaseController
{
    public function index() {
        $this->checkScopes(['litbang.access']);
        $params = $this->request->get();

        $params['id'] = array_key_exists('id', $params) ? $params['id'] : -1;
        $params['nama'] = array_key_exists('nama', $params) ? $params['nama'] : '';
        $params['trashed'] = array_key_exists('trashed', $params) ? $params['trashed'] : false;
        $params['limit'] = $this->getDefaultLimit($params);
        $params['offset'] = array_key_exists('offset', $params) ? $params['offset'] : 0;
        $params['order_by'] = array_key_exists('order_by', $params) ? strtolower($params['order_by']) : 'id';
        $params['order_direction'] = array_key_exists('order_direction', $params) ? strtolower($params['order_direction']) : 'asc';

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

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

        $conditions = [
            'conditions' => "
                (0 > :id: OR id = :id:) AND 
                nama ILIKE :nama:" . ($params['trashed'] ? '' : ' AND deleted_at IS NULL') . "
            ",
            'bind' => [
                'id' => $params['id'],
                'nama' => '%' . $params['nama'] . '%'
            ],
            'order' =>  $params['order_by'] . " " . $params['order_direction'],
        ];

        $result =  LitbangSatgas::find(array_merge($conditions, [
                'limit' => $params['limit'],
                'offset' => $params['offset']
            ]
        ));

        $total = LitbangSatgas::find($conditions)->count();

        return new PaginatedResponse($result, $total, $params['limit'], $params['offset']);
    }

    public function create() {
        $this->checkScopes(['litbang.manage_satgas']);
        $rawBody = $this->request->getJsonRawBody(true);
        $params = $this->validate(
            $rawBody,
            [
                "nama" => ['validators' => ['required']]
            ]
        );

        $record = new LitbangSatgas();
        $record->nama = $params['nama'];

        $success = $record->save();

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

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

            throw new ValidationException($error_messages);
        }
        $record = LitbangSatgas::findOrFail($record->id);

        return new SimpleResponse($record);
    }

    public function update($id) {
        $this->checkScopes(['litbang.manage_satgas']);
        $rawBody = $this->request->getJsonRawBody(true);
        $params = $this->validate(
            $rawBody,
            [
                "nama" => ['validators' => ['required']]
            ]
        );

        /** @var $record LitbangSatgas */
        $record = LitbangSatgas::findOrFail($id);
        $record->nama = $params['nama'];
        $record->updated_at = date('Y-m-d H:i:s');

        $success = $record->save();

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

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

            throw new ValidationException($error_messages);
        }

        return new SimpleResponse($record);
    }

    public function detail($id) {
        $this->checkScopes(['litbang.access']);
        /** @var $record LitbangSatgas */
        $record = LitbangSatgas::findOrFail($id);

        return $record->getDetail();
    }

    public function delete($id) {
        $this->checkScopes(['litbang.manage_satgas']);
        /** @var $record LitbangSatgas */
        $record = LitbangSatgas::findOrFail($id);

        if (!empty($record->deleted_at)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Satgas " . $record->nama . " telah dihapus!");
        }
        $record->deleted_at = date('Y-m-d H:i:s');
        $record->save();

        $record = LitbangSatgas::findOrFail($id);

        return new SimpleResponse($record);
    }

    public function restore($id) {
        $this->checkScopes(['litbang.manage_satgas']);
        /** @var $record LitbangSatgas */
        $record = LitbangSatgas::findOrFail($id);

        if (empty($record->deleted_at)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Satgas " . $record->nama . " belum dihapus!");
        }
        $record->deleted_at = null;
        $record->save();

        $record = LitbangSatgas::findOrFail($id);

        return new SimpleResponse($record);
    }
}
