<?php

class JejakKasusController extends BaseController
{
    public function list()
    {
        $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['status'] = array_key_exists('status', $getParams) ? $getParams['status'] : 0;

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

        $strWhere = 'nama ilike :keyword:';
        $bind['keyword'] = '%' . $params['keyword'] . '%';

        if($params['status'] > 0) {
            if($params['status'] == 1) {
                $strWhere .= ' and published = :is_published:';
                $bind['is_published'] = 1;
            } else if($params['status'] == 2) {
                $strWhere .= ' and (published = :is_published: or published is null)';
                $bind['is_published'] = 0;
            }
        }

        $jks = JejakKasus::find([
            'conditions' => $strWhere,
            'bind' => $bind,
            'limit' => $params['limit'],
            'offset' => $params['offset']
        ]);

        $result = [];
        foreach ($jks as $jk) {
            $result[] = $jk->toArrayDetail();
        }

        $total_record = JejakKasus::count([
            'conditions' => $strWhere,
            'bind' => $bind,
        ]);

        return new PaginatedResponse($result, $total_record, $params['limit'], $params['offset']);
    }
    public function create()
    {
        $rawBody = $this->request->getJsonRawBody(true);
        $params = $this->validate(
            $rawBody,
            [
                "wilayah_id" => ['validators' => ['digit']],
                "foto" => ['validator' => []],
                'deleted_foto' => ['validator' => []],
                'nama' => ['validators' => []],
                'jenis_kelamin' => ['validators' => []],
                'pendidikan' => ['validators' => []],
                'profesi' => ['validators' => []],
                'institusi' => ['validators' => []],
                'waktu_inkracht' => ['validators' => ['digit']],
                'area_korupsi' => ['validators' => []],
                'jenis_tpk' => ['validators' => []],
                'tingkat' => ['validators' => []],
                'nomor' => ['validators' => []],
                'tanggal' => ['validators' => []],
                'pidana' => ['validators' => []],
                'pidana_tambahan' => ['validators' => []],
                'denda' => ['validators' => []],
                'denda_tambahan' => ['validators' => []],
                'uang_pengganti' => ['validators' => []],
                'uang_pengganti_tambahan' => ['validators' => []],
                'uang_pengganti_tambahan2' => ['validators' => []],
                'biaya_perkara' => ['validators' => []],
                'summary' => ['validators' => []],
                'rampasans' => ['validators' => []],
                'deleted_attachments' => ['validator' => []],
                'attachments' => ['validator' => []]
                // 'published' => ['validators' => ['digit']]
            ]
        );
        if (!empty($params['attachments']) && !is_array($params['attachments'])) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Format Attachments tidak valid');
        }

        if (!empty($params['deleted_attachments']) && !is_array($params['deleted_attachments'])) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Format Deleted Attachments tidak valid');
        }

        $jk = new JejakKasus();
        $jk->wilayah_id = $params['wilayah_id'];
        $jk->foto = $params['foto'];
        $jk->nama = $params['nama'];
        $jk->jenis_kelamin = $params['jenis_kelamin'];
        $jk->pendidikan = $params['pendidikan'];
        $jk->profesi = $params['profesi'];
        $jk->institusi = $params['institusi'];
        $jk->waktu_inkracht = $params['waktu_inkracht'];
        $jk->area_korupsi = $params['area_korupsi'];
        $jk->jenis_tpk = $params['jenis_tpk'];
        $jk->tingkat = $params['tingkat'];
        $jk->nomor = $params['nomor'];
        $jk->tanggal = $params['tanggal'];
        $jk->pidana = $params['pidana'];
        $jk->pidana_tambahan = $params['pidana_tambahan'];
        $jk->denda = $params['denda'];
        $jk->denda_tambahan = $params['denda_tambahan'];
        $jk->uang_pengganti = $params['uang_pengganti'];
        $jk->uang_pengganti_tambahan = $params['uang_pengganti_tambahan'];
        $jk->uang_pengganti_tambahan2 = $params['uang_pengganti_tambahan2'];
        $jk->biaya_perkara = $params['biaya_perkara'];
        $jk->summary = $params['summary'];
        $jk->rampasans = $params['rampasans'];
        $status = $jk->save();

        if (!$status) {
            $errors = $jk->getMessages();
            $error_messages = [];

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

            throw new ValidationException($error_messages);
        }


        if (!empty($params['deleted_attachments'])) {
            foreach ($params['deleted_attachments'] as $uuid) {
                $attachment_record = Attachments::findFirstByUuid($uuid);

                if (!empty($attachment_record)) {
                    $attach_rec = JejakKasusAttachment::findFirstByIdAttachment($attachment_record->id);

                    if (!empty($attach_rec)) {
                        $attach_rec->delete();
                    }

                    AttachmentHelper::delete($attachment_record, true, $this->minio);
                }
            }
        }

        if (!empty($params['attachments'])) {
            foreach ($params['attachments'] as $key => $uuid) {
                $attachment_record = Attachments::findFirstByUuid($uuid);

                if (!empty($attachment_record) && empty($attachment_record->deleted_at)) {
                    $existing_attachments = JejakKasusAttachment::find([
                        'conditions' => 'id_jejak_kasus=:id_jejak_kasus: AND id_attachment=:id_attachment:',
                        'bind' => [
                            'id_jejak_kasus' => $jk->id,
                            'id_attachment' => $attachment_record->id
                        ]
                    ]);

                    if (count($existing_attachments) < 1) {
                        $jejak_kasus_attachment = new JejakKasusAttachment();
                        $jejak_kasus_attachment->id_jejak_kasus = $jk->id;
                        $jejak_kasus_attachment->id_attachment = $attachment_record->id;
                        $jejak_kasus_attachment->save();
                    }
                }
            }
        }

        $result = $jk->toArray();

        if (!empty($params['foto'])) {
            $attachment_foto = Attachments::findFirstByUuid($params['foto']);
            if (!empty($attachment_foto)) {
                $attachment_foto->status = Attachments::STATUS_REFERRED;
                $attachment_foto->referer = Attachments::REFERER_JEJAK_KASUS_PROFILE_PICTURE;
                $attachment_foto->save();
            } else {
                throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Foto tidak ditemukan');
            }

            $result["profile_picture_url"] = MediaHelper::getUrl($jk->foto, $this->config, $this->minio);
        }

        return new CollectionPaginatedResponse([$result]);
    }
    public function update($id)
    {
        $jk = JejakKasus::findFirst($id);

        if (empty($jk)) :
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Jejak Kasus dengan id' . $id . 'tidak ditemukan');
        endif;

        $rawBody = $this->request->getJsonRawBody(true);
        $params = $this->validate(
            $rawBody,
            [
                "wilayah_id" => ['validators' => ['digit']],
                'foto' => ['validators' => []],
                "deleted_foto" => ['validators' => []],
                'nama' => ['validators' => []],
                'jenis_kelamin' => ['validators' => []],
                'pendidikan' => ['validators' => []],
                'profesi' => ['validators' => []],
                'institusi' => ['validators' => []],
                'waktu_inkracht' => ['validators' => []],
                'area_korupsi' => ['validators' => []],
                'jenis_tpk' => ['validators' => []],
                'tingkat' => ['validators' => []],
                'nomor' => ['validators' => []],
                'tanggal' => ['validators' => []],
                'pidana' => ['validators' => []],
                'pidana_tambahan' => ['validators' => []],
                'denda' => ['validators' => []],
                'denda_tambahan' => ['validators' => []],
                'uang_pengganti' => ['validators' => []],
                'uang_pengganti_tambahan' => ['validators' => []],
                'uang_pengganti_tambahan2' => ['validators' => []],
                'biaya_perkara' => ['validators' => []],
                'summary' => ['validators' => []],
                'rampasans' => ['validators' => []],
                'deleted_attachments' => ['validator' => []],
                'attachments' => ['validator' => []]
            ]
        );

        $jk->wilayah_id = $params['wilayah_id'];
        $jk->foto = $params['foto'];
        $jk->nama = $params['nama'];
        $jk->jenis_kelamin = $params['jenis_kelamin'];
        $jk->pendidikan = $params['pendidikan'];
        $jk->profesi = $params['profesi'];
        $jk->institusi = $params['institusi'];
        $jk->waktu_inkracht = $params['waktu_inkracht'];
        $jk->area_korupsi = $params['area_korupsi'];
        $jk->jenis_tpk = $params['jenis_tpk'];
        $jk->tingkat = $params['tingkat'];
        $jk->nomor = $params['nomor'];
        $jk->tanggal = $params['tanggal'];
        $jk->pidana = $params['pidana'];
        $jk->pidana_tambahan = $params['pidana_tambahan'];
        $jk->denda = $params['denda'];
        $jk->denda_tambahan = $params['denda_tambahan'];
        $jk->uang_pengganti = $params['uang_pengganti'];
        $jk->uang_pengganti_tambahan = $params['uang_pengganti_tambahan'];
        $jk->uang_pengganti_tambahan2 = $params['uang_pengganti_tambahan2'];
        $jk->biaya_perkara = $params['biaya_perkara'];
        $jk->summary = $params['summary'];
        $jk->rampasans = $params['rampasans'];
        // $jk->published = $params['published'];
        $status = $jk->save();



        if (!$status) {
            $errors = $jk->getMessages();
            $error_messages = [];

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

            throw new ValidationException($error_messages);
        }

        if (!empty($params['deleted_attachments'])) {
            foreach ($params['deleted_attachments'] as $uuid) {
                $attachment_record = Attachments::findFirstByUuid($uuid);

                if (!empty($attachment_record)) {
                    $attach_rec = JejakKasusAttachment::findFirstByIdAttachment($attachment_record->id);

                    if (!empty($attach_rec)) {
                        $attach_rec->delete();
                    }

                    AttachmentHelper::delete($attachment_record, true, $this->minio);
                }
            }
        }

        if (!empty($params['attachments'])) {
            foreach ($params['attachments'] as $key => $uuid) {
                $attachment_record = Attachments::findFirstByUuid($uuid);

                if (!empty($attachment_record) && empty($attachment_record->deleted_at)) {
                    $existing_attachments = JejakKasusAttachment::find([
                        'conditions' => 'id_jejak_kasus=:id_jejak_kasus: AND id_attachment=:id_attachment:',
                        'bind' => [
                            'id_jejak_kasus' => $jk->id,
                            'id_attachment' => $attachment_record->id
                        ]
                    ]);

                    if (count($existing_attachments) < 1) {
                        $jejak_kasus_attachment = new JejakKasusAttachment();
                        $jejak_kasus_attachment->id_jejak_kasus = $jk->id;
                        $jejak_kasus_attachment->id_attachment = $attachment_record->id;
                        $jejak_kasus_attachment->created_by = $this->shared->user->um_id;
                        $jejak_kasus_attachment->save();
                    }
                }
            }
        }

        $result = $jk->toArray();

        if (!empty($params['foto'])) {
            $attachment_foto = Attachments::findFirstByUuid($params['foto']);
            if (!empty($attachment_foto)) {
                $attachment_foto->status = Attachments::STATUS_REFERRED;
                $attachment_foto->referer = Attachments::REFERER_JEJAK_KASUS_PROFILE_PICTURE;
                $attachment_foto->save();
            } else {
                throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Foto tidak ditemukan');
            }

            $result["profile_picture_url"] = MediaHelper::getUrl($jk->foto, $this->config, $this->minio);
        }

        return new CollectionPaginatedResponse([$result]);
    }

    public function setPublished()
    {
        $postParams = $this->request->getJsonRawBody(true);
        $params = [];

        $params['id_jejak_kasus'] = array_key_exists('id_jejak_kasus', $postParams) ? $postParams['id_jejak_kasus'] : null;

        $validatedParams = $this->validate(
            $params,
            [
                'id_jejak_kasus' => ['validators' => ['required']],
            ]
        );

        $jk = JejakKasus::findFirst([
            'conditions' => 'id = :id_jejak_kasus:',
            'bind' => ['id_jejak_kasus' => $validatedParams['id_jejak_kasus']]
        ]);

        if (empty($jk)) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, 'Jejak Kasus not found');
        }

        // if ($jk->isPublished()) {
        //     throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, 'Jejak Kasus sudah dipublikasi');
        // }

        $jk->published = 1;
        $jk->save();

        return new ObjectResponse([
            'success' => true,
            'data' => $jk
        ]);
    }

    public function setUnpublished()
    {
        $postParams = $this->request->getJsonRawBody(true);
        $params = [];

        $params['id_jejak_kasus'] = array_key_exists('id_jejak_kasus', $postParams) ? $postParams['id_jejak_kasus'] : null;

        $validatedParams = $this->validate(
            $params,
            [
                'id_jejak_kasus' => ['validators' => ['required']],
            ]
        );

        $jk = JejakKasus::findFirst([
            'conditions' => 'id = :id_jejak_kasus:',
            'bind' => ['id_jejak_kasus' => $validatedParams['id_jejak_kasus']]
        ]);

        if (empty($jk)) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, 'Jejak Kasus not found');
        }

        if ($jk->published < 1) {
            throw new CustomErrorException(400, 'Jejak Kasus Sudah tidak dipublikasikan');
        }

        $jk->published = 0;
        $jk->save();

        return new ObjectResponse([
            'success' => true,
            'data' => $jk
        ]);
    }

    public function upload()
    {
        $rawBody = $this->request->getJsonRawBody(true);
        $params = $this->validate(
            $rawBody,
            [
                'id_jejak_kasus' => ['validators' => ['required', 'digit']],
                'id_attachment' => ['validators' => ['required', 'digit']],
                'deleted_attachments' => ['validators' => []],
                'attachments' => ['validators' => []]
            ]
        );

        $jk = JejakKasus::findFirst($params['id_jejak_kasus']);
        if (empty($jk)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Jejak kasus tidak ditemukan');
        }

        if (!empty($params['attachments']) && !is_array($params['attachments'])) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Format Attachments tidak valid');
        }

        if (!empty($params['deleted_attachments']) && !is_array($params['deleted_attachments'])) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Format Deleted Attachments tidak valid');
        }

        $attachment_file = null;

        if (!empty($params['deleted_attachments'])) {
            foreach ($params['deleted_attachments'] as $uuid) {
                $attachment_record = Attachments::findFirstByUuid($uuid);

                if (!empty($attachment_record)) {
                    $attach_rec = JejakKasusAttachment::findFirstByIdAttachment($attachment_record->id);

                    if (!empty($attach_rec)) {
                        $attach_rec->delete();
                    }

                    AttachmentHelper::delete($attachment_record, true, $this->minio);
                }
            }
        }

        if (!empty($params['attachments'])) {
            foreach ($params['attachments'] as $key => $uuid) {
                $attachment_record = Attachments::findFirstByUuid($uuid);

                if (!empty($attachment_record) && empty($attachment_record->deleted_at)) {
                    $existing_attachments = JejakKasusAttachment::find([
                        'conditions' => 'id_jejak_kasus=:id_jejak_kasus: AND id_attachment=:id_attachment:',
                        'bind' => [
                            'id_jejak_kasus' => $attachment_file->id,
                            'id_attachment' => $attachment_record->id
                        ]
                    ]);

                    if (count($existing_attachments) < 1) {
                        $jejak_kasus_attachment = new JejakKasusAttachment();
                        $jejak_kasus_attachment->id_jejak_kasus = $attachment_file->id;
                        $jejak_kasus_attachment->id_attachment = $attachment_record->id;
                        $jejak_kasus_attachment->created_by = $this->shared->user->um_id;
                        $jejak_kasus_attachment->save();
                    }
                }
            }
        }

        return new CollectionPaginatedResponse([$attachment_file]);
    }
    public function detail($id)
    {
        $jk = JejakKasus::findFirst($id);

        if (empty($jk)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Jejak Kasus tidak ditemukan');
        }

        $result = $jk->toArray();
        $result["profile_picture_url"] = MediaHelper::getUrl($jk->foto, $this->config, $this->minio);


        return new CollectionPaginatedResponse([$result]);
    }
}
