<?php

class LitbangService {
    const ATTACHMENT_ROOT_DIRECTORY = 'litbang' . DIRECTORY_SEPARATOR;

    public static function createRepositoriFromPengajuan(LitbangKajianPengajuan $pengajuan, $userId) {
        $repositori = new LitbangKajianRepositori();
        $repositori->sektor_id = $pengajuan->sektor_id;
        $repositori->pengajuan_id = $pengajuan->id;
        $repositori->tahun = date('Y', strtotime($pengajuan->created_at));
        $repositori->kode = $repositori->generateCode();
        $repositori->judul = $pengajuan->judul;
        $repositori->latar_belakang = null;
        $repositori->tujuan_penelitian = null;
        $repositori->metode_pengumpulan_data = $pengajuan->rkk_pengumpulan_data_sekunder;
        $repositori->lokasi_subyek = null;
        $repositori->abstrak = null;
        $repositori->kata_kunci = null;
        $repositori->kesimpulan = null;
        $repositori->daftar_peneliti = $pengajuan->pt_daftar_peneliti;
        $repositori->kontak_peneliti = $pengajuan->pt_kontak_peneliti;
        $repositori->tgl_presentasi = null;
        $repositori->tgl_publikasi = date('Y-m-d');
        $repositori->mitra_kerjasama = $pengajuan->pk_pihak_ketiga;
        $repositori->narasumber = null;
        $repositori->status = LitbangKajianRepositori::STATUS_DRAFT;
        $repositori->src = LitbangKajianRepositori::SRC_PENGAJUAN;

        if (!$repositori->save()) {
            self::throwValidationError($repositori);
        }

        $litbangKajianPengajuanAttachments = $pengajuan->attachments;
        $litbangKajianPengajuanJenisDokumens = LitbangKajianRepositoriAttachment::getJenisDokumens();

        foreach ($litbangKajianPengajuanJenisDokumens as $litbangKajianPengajuanJenisDokumen) {
            if (!empty($litbangKajianPengajuanAttachments)) {
                foreach ($litbangKajianPengajuanAttachments as $litbangKajianPengajuanAttachment) {
                    if ($litbangKajianPengajuanJenisDokumen->ref == $litbangKajianPengajuanAttachment->tahapan) {
                        $litbangKajianRepositoriAttachment = new LitbangKajianRepositoriAttachment();
                        $litbangKajianRepositoriAttachment->attachment_id = $litbangKajianPengajuanAttachment->attachment_id;
                        $litbangKajianRepositoriAttachment->kajian_repositori_id = $repositori->id;
                        $litbangKajianRepositoriAttachment->jenis_dokumen_id = $litbangKajianPengajuanJenisDokumen->id;
                        $litbangKajianRepositoriAttachment->created_by = $userId;
                        $litbangKajianRepositoriAttachment->updated_by = $userId;
                        if (!$litbangKajianRepositoriAttachment->save()) {
                            self::throwValidationError($litbangKajianRepositoriAttachment);
                        }
                    }
                }
            }
        }
    }

    public static function createKajianFromRepositori(LitbangKajianRepositori $repository) {
        $kajian = new LitbangKajian();
        $kajian->sektor_id = $repository->sektor_id;
        $kajian->jenis_id = 1;
        $kajian->judul = $repository->judul;
        $kajian->tahun = $repository->tahun;
        $kajian->kode = $repository->kode;
        $kajian->deskripsi = $repository->abstrak . "\n" . $repository->kesimpulan;

        if (!$kajian->save()) {
            self::throwValidationError($kajian);
        }
    }

    private static function throwValidationError($model) {
        $errors = $model->getMessages();
        $error_messages = [];

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

        throw new ValidationException($error_messages);
    }

    public static function uploadImage($shared, MinioService $minioService, $request, $directory) {
        $service = new AttachmentService($shared, $minioService);
        $validationConfig = [
            'allowed-types' => ["image/jpg", "image/bmp", "image/x-windows-bmp", "image/jpeg", "image/png", "image/tiff", "image/gif"],
            'max-file-count' => 1,
            'max-size-kb' => 1024
        ];
        if ($minioService->isSecondaryS3Available()) {
            $result = $service->uploadUsingSecondaryS3(
                getenv("FILESYSTEM_CLOUD"),
                $validationConfig,
                ['tipe' => Attachments::TIPE_PRIVATE],
                $request,
                $directory,
                self::ATTACHMENT_ROOT_DIRECTORY
            );
        } else {
            $result = $service->upload(
                getenv("FILESYSTEM_CLOUD"),
                $validationConfig,
                ['tipe' => Attachments::TIPE_PRIVATE],
                $request,
                $directory,
                self::ATTACHMENT_ROOT_DIRECTORY
            );
        }

        return $result;
    }

    public static function uploadDocument($shared, MinioService $minioService, $request, $directory, $allowedTypes, $maxFileCount = 1, $maxFileKb = 5120) {
        $service = new AttachmentService($shared, $minioService);
        if ($minioService->isSecondaryS3Available()) {
            $result = $service->uploadUsingSecondaryS3(
                getenv("FILESYSTEM_CLOUD"),
                [
                    'allowed-types' => $allowedTypes,
                    'max-file-count' => $maxFileCount,
                    'max-size-kb' => $maxFileKb
                ],
                ['tipe' => Attachments::TIPE_PRIVATE],
                $request,
                $directory,
                self::ATTACHMENT_ROOT_DIRECTORY
            );
        } else {
            $result = $service->upload(
                getenv("FILESYSTEM_CLOUD"),
                [
                    'allowed-types' => $allowedTypes,
                    'max-file-count' => $maxFileCount,
                    'max-size-kb' => $maxFileKb
                ],
                ['tipe' => Attachments::TIPE_PRIVATE],
                $request,
                $directory,
                self::ATTACHMENT_ROOT_DIRECTORY
            );
        }

        return $result;
    }

    public static function downloadAttachment($shared, MinioService $minioService, $directory, $uuid, $urlOnly = false) {
        $service = new AttachmentService($shared, $minioService);
        if ($minioService->isSecondaryS3Available()) {
            $result = $service->downloadUsingSecondaryS3(
                $directory,
                $uuid,
                $urlOnly,
                self::ATTACHMENT_ROOT_DIRECTORY
            );
        } else {
            $result = $service->download(
                $directory,
                $uuid,
                $urlOnly,
                self::ATTACHMENT_ROOT_DIRECTORY
            );
        }

        return $result;
    }
}
