<?php

class StranasTargetController extends BaseController
{
    public function index()
    {
        $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' => []]
            ]
        );

        $targets = StranasTarget::find([
            'conditions' => 'keterangan ilike :keyword:',
            'bind' => [
                'keyword' => '%' . $params['keyword'] . '%'
            ],
            'limit' => $params['limit'],
            'offset' => $params['offset'],
            'order' => 'id'
        ]);

        $total_record = StranasTarget::count();

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


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

        $target = StranasTarget::findFirst($id);

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

        $result = $target->toDetail();

        return new CollectionPaginatedResponse([$result]);
    }

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

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

        $params = $this->validate(
            $rawBody,
            [
                'id_subaksi' => ['validators' => ['required']],
                'id_ukuran_keberhasilan' => ['validators' => []],
                'keterangan' => ['validators' => []],
                'info_nilai' => ['validators' => []],
                'info_lampiran' => ['validators' => []],
                'presentase_bobot' => ['validators' => ['numeric']]
            ]
        );

        $subaksi = StranasSubaksi::findFirst($params['id_subaksi']);
        $ukuran_keberhasilan = StranasUkuranKeberhasilan::findFirst($params['id_ukuran_keberhasilan']);
        
        if (empty($subaksi)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Subaksi tidak ditemukan');
        }
        if (!empty($subaksi->deleted_at)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Subaksi tidak aktif');
        }

        if (empty($ukuran_keberhasilan)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Ukuran Keberhasilan tidak ditemukan');
        }
        if (!empty($ukuran_keberhasilan->deleted_at)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Ukuran Keberhasilan tidak aktif');
        }

        $target = new StranasTarget();
        $target->id_subaksi = $params['id_subaksi'];
        // $target->id_subaksi = (isset($params['id_subaksi']) && $params['id_subaksi'] != 0) ? $params['id_subaksi'] : 1;
        // $target->id_ukuran_keberhasilan = $params['id_ukuran_keberhasilan'];
        $target->id_ukuran_keberhasilan = (isset($params['id_ukuran_keberhasilan']) && $params['id_ukuran_keberhasilan'] != 0) ? $params['id_ukuran_keberhasilan'] : 1;
        $target->keterangan = $params['keterangan'];
        if(!empty($params['presentase_bobot'])) {
            $target->presentase_bobot = $params['presentase_bobot'];
        }
        $target->info_nilai = $params['info_nilai'];
        $target->info_lampiran = $params['info_lampiran'];
        $target->created_by = $this->shared->user->um_id;
        $status = $target->save();

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

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

        $target = StranasTarget::findFirst($id);

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

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

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

        $params = $this->validate(
            $rawBody,
            [
                'id_ukuran_keberhasilan' => ['validators' => []],
                'id_subaksi' => ['validators' => ['required']],
                'keterangan' => ['validators' => []],
                'info_nilai' => ['validators' => []],
                'info_lampiran' => ['validators' => []],
                'presentase_bobot' => ['validators' => ['numeric']]
            ]
        );

        $ukuran_keberhasilan = StranasUkuranKeberhasilan::findFirst($params['id_ukuran_keberhasilan']);
        $subaksi = StranasSubaksi::findFirst($params['id_subaksi']);

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

        if (!empty($subaksi->deleted_at)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Subaksi tidak aktif');
        }

        if (empty($ukuran_keberhasilan)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Ukuran keberhasilan tidak ditemukan');
        }

        if (!empty($ukuran_keberhasilan->deleted_at)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Ukuran Keberhasilan tidak aktif');
        }

        $target->id_subaksi = $params['id_subaksi'];
        $target->id_ukuran_keberhasilan = $params['id_ukuran_keberhasilan'];
        $target->keterangan = $params['keterangan'];
        if(!empty($params['presentase_bobot'])) {
            $target->presentase_bobot = $params['presentase_bobot'];
        }
        $target->info_nilai = $params['info_nilai'];
        $target->info_lampiran = $params['info_lampiran'];
        $target->updated_at = date('Y-m-d H:i:s');
        $target->updated_by = $this->shared->user->um_id;
        $status = $target->save();

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

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

        $target = StranasTarget::findFirst($id);

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

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

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

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

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

        $target = StranasTarget::findFirst($id);

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

        if (empty($target->deleted_at)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Target sudah aktif');
        }

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

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