<?php

class PancekAnswerAttachmentController extends BaseController
{
    public function download($uuid)
    {
        $this->checkOneOfScopes(['pancek.admin', 'pancek.monitoring', 'pancek.verify', 'pancek.answer', 'pancek.bk.verify']);

        $getParams = $this->request->get();

        $post = $this->validate($getParams, [
            'formulir_id' => ['validators' => ['required', 'digit']]
        ]);

        /** @var $formulir PancekFormulir */
        $formulir = PancekFormulir::findFirst($post['formulir_id']);
        if (!$formulir) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Formulir tidak ditemukan");
        }

        if ($this->hasScopes(['pancek.answer'])) {
            if ($formulir->instansi && $formulir->instansi->user && $formulir->instansi->user->um_id != $this->shared->user->um_id) {
                throw new CustomErrorException(BaseResponse::INVALID_AUTHENTICATION_AUTHORIZATION, "Anda tidak berhak mengakses");
            }
        }

        $service = new AttachmentService($this->shared, $this->minio);

        return $service->downloadUsingDualS3(
            PancekAnswerAttachment::DOCUMENT_DIR . DIRECTORY_SEPARATOR,
            $uuid,
            true,
            LogAttachments::PancekAnswerAttachment
        );
    }
    public function preview($uuid)
    {
        $this->checkOneOfScopes(['pancek.admin', 'pancek.monitoring', 'pancek.verify', 'pancek.answer', 'pancek.kppbc.verify', 'pancek.kppbc.assignor', 'pancek.bk.verify', 'pancek.bk.assignor']);

        $getParams = $this->request->get();

        $post = $this->validate($getParams, [
            'formulir_id' => ['validators' => ['required', 'digit']]
        ]);

        /** @var $formulir PancekFormulir */
        $formulir = PancekFormulir::findFirst($post['formulir_id']);
        if (!$formulir) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Formulir tidak ditemukan");
        }

        if ($this->hasScopes(['pancek.answer'])) {
            if ($formulir->instansi && $formulir->instansi->user && $formulir->instansi->user->um_id != $this->shared->user->um_id) {
                throw new CustomErrorException(BaseResponse::INVALID_AUTHENTICATION_AUTHORIZATION, "Anda tidak berhak mengakses");
            }
        }
        if ($this->hasScopes(['pancek.kppbc.verify'])) {
            $idInstansiBeaCukai = Instansi::getIdInstansiDitjenBeaCukai();
            $idInstansiUser = $this->shared->user->id_instansi;
            if($idInstansiBeaCukai != $idInstansiUser) {
                throw new CustomErrorException(BaseResponse::INVALID_AUTHENTICATION_AUTHORIZATION, "Anda tidak berhak mengakses");
            }

            $kppbcs = PancekKppbcUser::findVerifikatorOnlyBy($this->userID);
            if(empty($kppbcs)) {
                throw new CustomErrorException(BaseResponse::INVALID_AUTHENTICATION_AUTHORIZATION, "Anda tidak berhak mengakses");
            }

            $kppbcIds = array_column($kppbcs->toArray(), 'kppbc_id');
            $instansiPancek = $formulir->instansi;
            if(!in_array($instansiPancek->kppbc_id, $kppbcIds)) {
                throw new CustomErrorException(BaseResponse::INVALID_AUTHENTICATION_AUTHORIZATION, "Anda tidak berhak mengakses");
            }

        }

        $service = new AttachmentService($this->shared, $this->minio);

        return $service->downloadUsingDualS3(
            PancekAnswerAttachment::DOCUMENT_DIR . DIRECTORY_SEPARATOR,
            $uuid,
            false,
            LogAttachments::PancekAnswerAttachment
        );
    }

    public function upload()
    {
        $this->checkScopes(['pancek.answer']);
        $postParams = $this->request->getPost();

        $post = $this->validate($postParams, [
            'formulir_id' => ['validators' => ['required', 'digit']],
            'answer_id' => ['validators' => ['required', 'digit']],
        ]);

        /** @var $formulir PancekFormulir */
        $formulir = PancekFormulir::findFirst($post['formulir_id']);
        if (!$formulir) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Formulir tidak ditemukan");
        }

        if ($formulir->instansi && $formulir->instansi->user && $formulir->instansi->user->um_id != $this->shared->user->um_id) {
            throw new CustomErrorException(BaseResponse::INVALID_AUTHENTICATION_AUTHORIZATION, "Anda tidak berhak mengakses");
        }

        if ($formulir->isExpired()) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Formulir telah expired");
        }

        if ($formulir->isExceedRevisionLimit()) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Formulir telah melebihi batas maksimum revisi");
        }

        if($formulir->status == PancekFormulir::STATUS_NEED_TO_REVIEW || $formulir->status == PancekFormulir::STATUS_REVIEW_IN_PROGRESS) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_AVAILABLE, "Formulir sudah diteruskan dan sedang proses review");
        }

        if($formulir->status == PancekFormulir::STATUS_VERIFIED) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_AVAILABLE, "Formulir sudah diverifikasi");
        }

        /** @var $answer PancekAnswer */
        $answer = PancekAnswer::findFirst($post['answer_id']);
        if (!$answer) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Answer tidak ditemukan");
        }
        if($answer->verify_status == PancekAnswer::VERIFY_STATUS_DISETUJUI) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_AVAILABLE, "Dokumen sudah Diterima/Disetujui");
        }

        $service = new AttachmentService($this->shared, $this->minio);

        if($this->minio->isSecondaryS3Available()) {
            $result = $service->uploadUsingSecondaryS3(
                getenv("FILESYSTEM_CLOUD"),
                [
                    'allowed-types' => [
                        "application/pdf",
                        "application/msword",
                        "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
                    ],
                    'max-file-count' => 5,
                    'max-size-kb' => 10240
                ],
                ['tipe' => Attachments::TIPE_PRIVATE],
                $this->request,
                PancekAnswerAttachment::DOCUMENT_DIR . DIRECTORY_SEPARATOR
            );
        }
        else {
            $result = $service->upload(
                getenv("FILESYSTEM_CLOUD"),
                [
                    'allowed-types' => [
                        "application/pdf",
                        "application/msword",
                        "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
                    ],
                    'max-file-count' => 5,
                    'max-size-kb' => 10240
                ],
                ['tipe' => Attachments::TIPE_PRIVATE],
                $this->request,
                PancekAnswerAttachment::DOCUMENT_DIR . DIRECTORY_SEPARATOR
            );
        }

        return new CollectionPaginatedResponse($result);
    }

    public function remove($id) {
        $this->checkOneOfScopes(['pancek.admin', 'pancek.verify', 'pancek.bk.verify']);

        /** @var PancekAnswerAttachment $pancekAnswerAttachment */
        $pancekAnswerAttachment = PancekAnswerAttachment::findFirst($id);
        if (!$pancekAnswerAttachment) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Lampiran tidak ditemukan.");
        }

        $pancekAnswer = $pancekAnswerAttachment->answer;
        $formulir = $pancekAnswer->formulir;

        if($formulir->status == PancekFormulir::STATUS_NEED_TO_REVIEW || $formulir->status == PancekFormulir::STATUS_REVIEW_IN_PROGRESS) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_AVAILABLE, "Formulir sudah diteruskan dan sedang proses review");
        }

        if($formulir->status == PancekFormulir::STATUS_VERIFIED) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_AVAILABLE, "Formulir sudah diverifikasi");
        }

        if($pancekAnswer->verify_status == PancekAnswer::VERIFY_STATUS_DISETUJUI) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_AVAILABLE, "Dokumen sudah Diterima/Disetujui");
        }

        $this->db->begin();
        try {
            $pancekAnswerAttachment->hardDelete($this->minio);
            $this->db->commit();
            return new SimpleResponse(1);
        } catch (\Exception $e) {
            $this->db->rollback();
            throw $e;
        }
    }
}
