<?php

namespace Modules\Lpj\Services;


use Carbon\Carbon;
use App\Helpers\Lpj;
use Modules\Lpj\Models\Denah;
use Modules\Lpj\Models\Teams;
use Modules\Lpj\Models\Branch;
use Modules\Lpj\Models\Lantai;
use Barryvdh\DomPDF\Facade\Pdf;
use Modules\Lpj\Models\Analisa;
use Modules\Lpj\Models\Penilai;
use Modules\Lpj\Models\Debiture;
use Modules\Lpj\Models\Inspeksi;
use Modules\Lpj\Models\Surveyor;
use Modules\Lpj\Models\ViewUnit;
use Modules\Location\Models\City;
use Modules\Lpj\Models\JenisUnit;
use Modules\Lpj\Models\Penilaian;
use Modules\Lpj\Models\Perizinan;
use Modules\Lpj\Models\BentukUnit;
use Modules\Lpj\Models\JenisKapal;
use Modules\Lpj\Models\LantaiUnit;
use Modules\Lpj\Models\Lingkungan;
use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\PosisiUnit;
use Illuminate\Support\Facades\Log;
use Modules\Lpj\Models\AnalisaUnit;
use Modules\Lpj\Models\BentukTanah;
use Modules\Lpj\Models\FotoJaminan;
use Modules\Lpj\Models\KonturTanah;
use Modules\Lpj\Models\RuteJaminan;
use Modules\Location\Models\Village;
use Modules\Lpj\Models\AnalisaFakta;
use Modules\Lpj\Models\JenisJaminan;
use Modules\Lpj\Models\JenisPesawat;
use Modules\Lpj\Models\ObjekJaminan;
use Modules\Lpj\Models\SpekBangunan;
use Modules\Lpj\Models\TerletakArea;
use Modules\Location\Models\District;
use Modules\Location\Models\Province;
use Modules\Lpj\Models\ArahMataAngin;
use Modules\Lpj\Models\JenisBangunan;
use Modules\Lpj\Models\PosisiKavling;
use Modules\Lpj\Models\SifatBangunan;
use Modules\Lpj\Models\DokumenJaminan;
use Modules\Lpj\Models\FasilitasObjek;
use Modules\Lpj\Models\JenisKendaraan;
use Modules\Lpj\Models\ModelAlatBerat;
use Modules\Lpj\Models\KetinggianTanah;
use Modules\Lpj\Models\KondisiBangunan;
use Modules\Lpj\Models\LaporanExternal;
use Modules\Lpj\Models\MerupakanDaerah;
use Modules\Lpj\Models\PerkerasanJalan;
use Modules\Lpj\Models\SaranaPelengkap;
use Modules\Lpj\Models\TujuanPenilaian;
use Modules\Lpj\Models\FotoObjekJaminan;
use Modules\Lpj\Models\LaluLintasLokasi;
use Modules\Lpj\Models\TingkatKeramaian;
use Modules\Lpj\Models\AnalisaLingkungan;
use Modules\Lpj\Models\KondisiFisikTanah;
use Modules\Lpj\Models\AnalisaTanahBagunan;
use Modules\Lpj\Models\GolonganMasySekitar;
use Modules\Lpj\Models\SpekBangunanAnalisa;
use Modules\Lpj\Models\DetailDokumenJaminan;
use Modules\Lpj\Models\SpekKategoritBangunan;
use Modules\Lpj\Http\Requests\SurveyorRequest;
use Modules\Lpj\Models\HubunganPemilikJaminan;
use Modules\Lpj\Models\HubunganPenghuniJaminan;
use Modules\Lpj\Models\SpekBagunanAnalisaDetail;
use Modules\Lpj\Jobs\SendJadwalKunjunganEmailJob;
use Modules\Lpj\Http\Requests\FormSurveyorRequest;

class PreviewLaporanService
{
    /**
     * Preview Laporan dan unduh foto terkait dengan logika fallback path.
     *
     * Menghasilkan PDF atau paket unduhan foto berdasarkan status laporan.
     * Jika file foto asli tidak ditemukan dan status LPJ adalah 1, maka
     * sistem akan mencoba menggunakan fallback path dengan pola
     * `surveyor/001/{lastTwoParts}` untuk meminimalisir gambar hilang.
     *
     * @param  int     $permohonan_id  ID Permohonan
     * @param  int     $dokumen_id     ID Dokumen
     * @param  int     $jaminan_id     ID Jaminan
     * @param  string  $back           URL atau rute kembali
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function previewLaporan($permohonan_id, $dokumen_id, $jaminan_id, $back)
    {
        $permohonan = $this->getPermohonanJaminanId(
            $permohonan_id,
            $dokumen_id,
            $jaminan_id
        );
        // $tipeLaporanResponse = $this->checkPrintOutLaporan($permohonan_id, $document_id);
        // $tipeLaporan = $tipeLaporanResponse->getData();

        // if (!$tipeLaporan->status) {
        //     return redirect()->back()->with('error', 'Laporan tidak valid');
        // }
        $basicData =  $this->getCommonData();

        $inspeksi = Inspeksi::where('permohonan_id', $permohonan_id)->where('dokument_id', $dokumen_id)->first();
        $lpj = Penilai::where('permohonan_id', $permohonan_id)->where('dokument_id', $dokumen_id)->first();

        $mig_permohonan = json_decode($permohonan->mig_permohonan);

        $nomorLaporan = getNomorLaporan($permohonan_id, $dokumen_id);
        $tanggalLaporan =  $permohonan->is_mig
            ? ($mig_permohonan->mig_mst_jaminan_tgl_laporan ?? $mig_permohonan->mig_mst_jaminan_tgl_create ?? null)
            : ($lpj->created_at ?? null);
        $forminspeksi = null;
        $lpjData = null;
        $formFoto  = null;

        // if ($inspeksi) {
        $forminspeksi = json_decode($inspeksi?->data_form, true) ?? null;

        $formFoto = json_decode($inspeksi?->foto_form, true) ?? null;
        // $denahForm = json_decode($data->denah_form, true);
        $dataPembanding = json_decode($inspeksi?->data_pembanding, true) ?? null;
        // }

        // if ($lpj) {
        $lpjData = json_decode($lpj?->lpj, true) ?? null;
        $memo = json_decode($lpj?->memo, true) ?? null;
        $resumeData = json_decode($lpj?->resume, true) ?? null;
        $rap = json_decode($lpj?->rap, true);
        $report = json_decode($lpj?->call_report, true) ?? null;
        // }

        $inputAddress = $forminspeksi['asset']['alamat']['sesuai'] ?? $forminspeksi['asset']['alamat']['tidak sesuai'] ?? [];

        $alamat = [
            'address' => $inputAddress['address'] ?? null,
            'village_code' => getWilayahName($inputAddress['village_code'] ?? null, 'village'),
            'district_code' => getWilayahName($inputAddress['district_code'] ?? null, 'district'),
            'city_code' => getWilayahName($inputAddress['city_code'] ?? null, 'city'),
            'province_code' => getWilayahName($inputAddress['province_code'] ?? null, 'province')
        ];

        $statusLpj = 0;

        // $viewLaporan = $this->getViewLaporan($tipeLaporan);
        return view('lpj::component.show-laporan-inspeksi', compact('permohonan', 'basicData', 'forminspeksi', 'alamat', 'lpjData', 'memo', 'resumeData', 'rap', 'report', 'lpj', 'formFoto', 'nomorLaporan', 'tanggalLaporan', 'dataPembanding', 'inspeksi', 'statusLpj', 'permohonan_id', 'back', ));
    }

    public function printOutLaporan($permohonan_id, $document_id, $jaminan_id)
    {
        $tipeLaporanResponse = $this->checkPrintOutLaporan($permohonan_id, $document_id);
        $tipeLaporan = $tipeLaporanResponse->getData();

        //dd($permohonan_id, $document_id, $tipeLaporan);

        if (!$tipeLaporan->status) {
            //return redirect()->back()->with('error', 'Laporan tidak valid');
        }
        $permohonan = $this->getPermohonanJaminanId(
            $permohonan_id,
            $document_id,
            $jaminan_id
        );

        $basicData = $this->getCommonData();

        $inspeksi = Inspeksi::where('permohonan_id', $permohonan_id)->where('dokument_id', $document_id)->first();
        $lpj = Penilai::where('permohonan_id', $permohonan_id)->first(); //->where('dokument_id', $document_id)->first();

        $mig_permohonan = json_decode($permohonan->mig_permohonan);
        $nomorLaporan = getNomorLaporan($permohonan_id, $document_id);

        //Carbon::createFromFormat('d/m/Y H:i:s', $mig_permohonan->mig_mst_jaminan_tgl_laporan)->format('Y-m-d H:i:s');

         $tanggalLaporan =  $permohonan->is_mig
            ? ($mig_permohonan->mig_mst_jaminan_tgl_laporan
                ? Carbon::createFromFormat('d/m/Y H:i:s', $mig_permohonan->mig_mst_jaminan_tgl_laporan)->format('Y-m-d H:i:s')
                : ($mig_permohonan->mig_mst_jaminan_tgl_oto
                    ? Carbon::createFromFormat('d/m/Y H:i:s', $mig_permohonan->mig_mst_jaminan_tgl_oto)->format('Y-m-d H:i:s')
                    : null))
            : ($lpj->created_at ?? null);


        $forminspeksi = null;
        $lpjData = null;
        $formFoto  = null;

        $dataPembanding ='';
        if ($inspeksi) {
            $forminspeksi = json_decode($inspeksi->data_form, true);
            $formFoto = json_decode($inspeksi->foto_form, true);
            // $denahForm = json_decode($data->denah_form, true);
            $dataPembanding = json_decode($inspeksi->data_pembanding, true);
        }


        if ($lpj) {
            $lpjData = json_decode($lpj->lpj, true);
            $memo = json_decode($lpj->memo, true);
            $resumeData = json_decode($lpj->resume, true);
            $rap = json_decode($lpj->rap, true);
            $report = json_decode($lpj->call_report, true);
        }

        $inputAddress = $forminspeksi['asset']['alamat']['sesuai'] ?? $forminspeksi['asset']['alamat']['tidak sesuai'] ?? [];

        $inputAddress = $forminspeksi['asset']['alamat']['sesuai'] ?? $forminspeksi['asset']['alamat']['tidak sesuai'] ?? [];
        $alamat = [
                'address' => $inputAddress['address'] ?? null,
                'village_code' => getWilayahName($inputAddress['village_code'] ?? null, 'village'),
                'district_code' => getWilayahName($inputAddress['district_code'] ?? null, 'district'),
                'city_code' => getWilayahName($inputAddress['city_code'] ?? null, 'city'),
                'province_code' => getWilayahName($inputAddress['province_code'] ?? null, 'province')
            ];

        $viewLaporan = $this->getViewLaporan($tipeLaporan->status);

        $statusLpj = 1;

            $mig_permohonan = json_decode($permohonan->mig_permohonan);
	        $nilaiPasar = $mig_permohonan->mig_mst_lpj_tot_nilai_pasar ?? null;

            if(($tipeLaporan->status === 'memo' && $permohonan->mig_permohonan && $permohonan->is_mig) || ($nilaiPasar !== null && $nilaiPasar < 1 && $permohonan->is_mig)){
                $paths = $formFoto['upload_foto'] ?? null;

                if (!is_array($paths) || empty($paths)) {
                    return response()->json(['error' => 'No files to download'], 404);
                }

                $files = [];
                foreach ($paths as $path) {
                    if (!$path['path']) {
                        Log::warning('PreviewLaporanService: Path kosong terdeteksi dalam daftar paths.');
                        continue;
                    }

                    // Logika fallback untuk path file
                    $originalPath = $path['path'];
                    $fallbackPath = null;

                    // Jika file asli tidak ditemukan, buat fallback path
                    if ($statusLpj == 1) {
                        $fullOriginalPath = storage_path('app/public/' . $originalPath);

                        if (!file_exists($fullOriginalPath)) {
                            // Ekstrak bagian akhir path (contoh: 251051/251051_2_2.png)
                            $pathParts = explode('/', $originalPath);
                            if (count($pathParts) >= 2) {
                                $lastTwoParts = array_slice($pathParts, -2);
                                $fallbackPath = 'surveyor/001/' . implode('/', $lastTwoParts);
                                Log::info('PreviewLaporanService: Menggunakan fallback path kandidat.', [
                                    'original' => $originalPath,
                                    'fallback' => $fallbackPath,
                                ]);
                            }
                        }
                    }

                    // Tentukan path yang akan digunakan
                    $pathToUse = ($fallbackPath && $statusLpj == 1 && file_exists(storage_path('app/public/' . $fallbackPath)))
                        ? $fallbackPath
                        : $originalPath;

                    $fullPath = storage_path('app/public/' . $pathToUse);
                    if (!file_exists($fullPath)) {
                        Log::warning('PreviewLaporanService: File tidak ditemukan untuk original maupun fallback.', [
                            'original' => $originalPath,
                            'fallback' => $fallbackPath,
                            'resolved' => $pathToUse,
                        ]);
                        continue;
                    }

                    Log::info('PreviewLaporanService: Menambahkan file untuk diunduh.', [
                        'resolved' => $pathToUse,
                        'fullPath' => $fullPath,
                    ]);
                    $files[] = $fullPath;
                }

                if (empty($files)) {
                    Log::warning('PreviewLaporanService: Tidak ada file valid ditemukan setelah resolusi path.');
                    return response()->json(['error' => 'No valid files found'], 404);
                }

                // For single file, download directly
                if (count($files) === 1) {
                    Log::info('PreviewLaporanService: Mengunduh single file.', ['file' => $files[0]]);
                    return response()->download($files[0]);
                }

                // For multiple files, create zip and download
                $zipName = 'photos_' . time() . '.zip';
                $zipPath = storage_path('app/public/' . $zipName);

                $zip = new \ZipArchive();
                if ($zip->open($zipPath, \ZipArchive::CREATE) === true) {
                    foreach ($files as $file) {
                        $zip->addFile($file, basename($file));
                    }
                    $zip->close();
                    Log::info('PreviewLaporanService: Zip file berhasil dibuat.', ['zip' => $zipPath, 'count' => count($files)]);
                    return response()->download($zipPath)->deleteFileAfterSend(true);
                }

                Log::error('PreviewLaporanService: Gagal membuat zip file.');
                return response()->json(['error' => 'Failed to create zip file'], 500);
            }
        try {
            $pdf = $this->generatePDF($viewLaporan, compact(
                'permohonan',
                'forminspeksi',
                'lpjData',
                'formFoto',
                'basicData',
                'inspeksi',
                'lpj',
                'statusLpj',
                'alamat',
                'dataPembanding',
                'nomorLaporan',
                'memo',
                'resumeData',
                'tanggalLaporan',
                'rap',
                'report'
            ));

            $cleanNomorLaporan = str_replace(['/', '\\'], '-', $nomorLaporan);
            $filename = 'Laporan_' . $tipeLaporan->status . '_' . $permohonan->debiture->name . '_' . $cleanNomorLaporan;

            return  $pdf->download($filename . '_data.pdf');
        } catch (\Exception $e) {
            Log::error('PDF generation failed: ' . $e->getMessage());
            return response()->json(['error' => 'Failed to generate PDF. Please check the log for details.'], 500);
        }
    }

    private function generatePDF(string $viewLaporan, array $data)
    {
        //return view('lpj::' . $viewLaporan, $data);

        $pdf = PDF::loadView('lpj::' . $viewLaporan, $data);
        $pdf->setPaper('A4', 'portrait');
        $pdf->set_option('isHtml5ParserEnabled', true);
        $pdf->set_option('isPhpEnabled', true);

        return $pdf;
    }


    private function getViewLaporan($tipe)
    {
        $viewMap = [
            'sederhana' => 'penilai.components.print-out-sederhana',
            'standar' => 'penilai.components.print-out-standar',
            'resume' => 'penilai.components.print-resume',
            'memo' => 'penilai.components.print-memo',
            'rap' => 'penilai.components.print-out-rap',
            'call-report' => 'penilai.components.print-out-call-report'
        ];
        return $viewMap[$tipe] ?? 'penilai.components.print-resume';
    }

    public function checkPrintOutLaporan($permohonan_id, $dokumen_id)
    {

        // Ambil data berdasarkan ID
        $statusLpj = Penilai::where('permohonan_id', $permohonan_id)
            //->where('dokument_id', $dokumen_id)
            ->first();


        $permohonan = Permohonan::where('id', $permohonan_id)->first();

        // Jika data tidak ditemukan, kembalikan status null
        if (!$statusLpj) {
            return response()->json(['status' => null]);
        }

        // Tentukan tipe berdasarkan kondisi
        $type = $statusLpj->type_penilai ?? null;

        if ($type === 'memo' && $permohonan->is_mig!=1) {
            return $this->checkDataMemo($type, $statusLpj);
        }

        if ($type === 'resume') {
            return $this->checkDataResume($type, $statusLpj);
        }


        if ($type === 'standar' || $type === 'sederhana') {
            return $this->checkDataLpj($type, $statusLpj);
        }

        if ($type === 'rap') {
            return $this->checkDataRap($type, $statusLpj);
        }



        // Kembalikan respons dengan tipe yang sesuai
        return response()->json(['status' => $type]);
    }

    public function checkDataMemo($type, $statusLpj)
    {
        // Ambil data JSON dari statusLpj
        $data = json_decode($statusLpj->memo, true) ?? [];


        $validationRules = [
            'memo' => [
                'kepada',
                'dari',
                'nomor_memo',
                'tanggal',
                'perihal',
                'jenis_asset_tidak_sesuai',
                'lokasi.lokasi',
                'lokasi.province_code',
                'lokasi.city_code',
                'lokasi.district_code',
                'lokasi.village_code',
                'lokasi.penilai',
                'terlampir',
                'hasil_survey',
                'kesimpulan_saran',
            ],
        ];

        // Validasi data JSON
        if (isset($validationRules[$type])) {
            $missingFields = [];

            foreach ($validationRules[$type] as $field) {
                $keys = explode('.', $field);
                $value = $data;

                foreach ($keys as $key) {
                    if (!isset($value[$key])) {
                        $missingFields[] = $field;
                        break;
                    }
                    $value = $value[$key];
                }
            }

            // Jika ada field yang kosong, kembalikan error
            if (!empty($missingFields)) {
                return response()->json([
                    'status' => null,
                    'message' => "Silahkan lengkapi data memo terlebih dahulu.",
                    'missing_fields' => $missingFields,
                ], 400);
            }
        }

        // Jika data valid
        return response()->json([
            'status' => $type,
            'message' => "Data memo valid.",
        ]);
    }




    public function checkDataResume($type, $statusLpj)
    {
        // Ambil data JSON dari statusLpj
        $data = json_decode($statusLpj->resume, true) ?? [];

        $validationRules = [
            'resume' => [
                'fisik'
            ],
        ];

        // Validasi data JSON
        if (isset($validationRules[$type])) {
            $missingFields = [];

            foreach ($validationRules[$type] as $field) {
                $keys = explode('.', $field);
                $value = $data;

                foreach ($keys as $key) {
                    if (!isset($value[$key])) {
                        $missingFields[] = $field;
                        break;
                    }
                    $value = $value[$key];
                }

                // Validasi khusus untuk array fisik dan sesuai_imb
                if ($field === 'fisik' || $field === 'sesuai_imb') {
                    if (empty($value) || !is_array($value)) {
                        $missingFields[] = $field;
                        continue;
                    }

                    // Validasi struktur data di dalam array
                    foreach ($value as $item) {
                        $requiredKeys = ['sertifikat', 'luas_tanah', 'nilai'];
                        foreach ($requiredKeys as $requiredKey) {
                            if (!isset($item[$requiredKey])) {
                                $missingFields[] = $field . '.' . $requiredKey;
                            }
                        }
                    }
                }
            }

            // Jika ada field yang kosong, kembalikan error
            if (!empty($missingFields)) {
                return response()->json([
                    'status' => null,
                    'message' => "Silahkan lengkapi data resume terlebih dahulu.",
                    'missing_fields' => $missingFields,
                ], 400);
            }
        }

        // Jika data valid
        return response()->json([
            'status' => $type,
            'message' => "Data resume valid.",
        ]);
    }

    public function checkDataLpj($type, $statusLpj)
    {
        // Ambil data JSON dari statusLpj
        $data = json_decode($statusLpj->lpj, true) ?? [];

        $validationRules = [
            'lpj' => [
                'luas_tanah',
                'nilai_tanah_1',
                'nilai_tanah_2',
                'luas_bangunan',
                'nilai_bangunan_1',
                'nilai_bangunan_2',
                'total_nilai_pasar_wajar',
                'likuidasi',
                'likuidasi_nilai_1',
                'likuidasi_nilai_2',
                'asuransi_luas_bangunan',
                'asuransi_nilai_1',
                'asuransi_nilai_2',
                'npw_tambahan'
            ],
        ];

        // Validasi data JSON
        if (isset($validationRules[$type])) {
            $missingFields = [];

            foreach ($validationRules[$type] as $field) {
                // Penanganan khusus untuk field yang boleh null
                if (in_array($field, ['sarana_pelengkap_penilai', 'nilai_sarana_pelengkap_1', 'nilai_sarana_pelengkap_2'])) {
                    continue;
                }

                if (!isset($data[$field])) {
                    $missingFields[] = $field;
                    continue;
                }

                // Validasi khusus untuk npw_tambahan
                if ($field === 'npw_tambahan' && is_array($data[$field])) {
                    foreach ($data[$field] as $index => $item) {
                        $requiredKeys = ['name', 'luas', 'nilai_1', 'nilai_2'];
                        foreach ($requiredKeys as $key) {
                            if (!isset($item[$key])) {
                                $missingFields[] = "npw_tambahan[$index].$key";
                            }
                        }
                    }
                }
            }


            // Jika ada field yang kosong, kembalikan error
            if (!empty($missingFields)) {
                return response()->json([
                    'status' => null,
                    'message' => "Silahkan lengkapi data LPJ terlebih dahulu.",
                    'missing_fields' => $missingFields,
                ], 400);
            }
        }

        // Jika data valid
        return response()->json([
            'status' => $type,
            'message' => "Data LPJ valid.",
        ]);
    }

    public function checkDataRap($type, $statusLpj)
    {
        // Ambil data JSON dari statusLpj
        $data = json_decode($statusLpj->rap, true) ?? [];

        $requiredFields = [
            'dari',
            'kepada',
            'perihal',
            'tanggal',
            'nomor_rap'
        ];

        // Cek apakah ada field yang kosong
        $missingFields = [];
        foreach ($requiredFields as $field) {
            if (!isset($data[$field]) || empty($data[$field])) {
                $missingFields[] = $field;
            }
        }

        // Jika ada field yang kosong, kembalikan error
        if (!empty($missingFields)) {
            return response()->json([
                'status' => null,
                'message' => "Silahkan lengkapi data RAP terlebih dahulu.",
                'missing_fields' => $missingFields
            ], 400);
        }

        // Jika semua data terisi
        return response()->json([
            'status' => $type,
            'message' => "Data RAP valid."
        ]);
    }
    private function getPermohonanJaminanId($id, $dokumentId, $jaminanId)
    {
        return Permohonan::with([
            'user',
            'debiture.province',
            'debiture.city',
            'debiture.district',
            'debiture.village',
            'branch',
            'tujuanPenilaian',
            'penilaian',
            'penawaran',
            'debiture.documents' => function ($query) use ($dokumentId, $jaminanId) {
                $query->where('id', $dokumentId)
                      ->where('jenis_jaminan_id', $jaminanId);
            }
            ])->findOrFail($id);
    }

    public function getCommonData()
    {
        return [
            'branches' => Branch::all(),
            'bentukTanah' => BentukTanah::all(),
            'konturTanah' => KonturTanah::all(),
            'posisiKavling' => PosisiKavling::all(),
            'ketinggianTanah' => KetinggianTanah::all(),
            'kondisiFisikTanah' => KondisiFisikTanah::all(),
            'jenisBangunan' => JenisBangunan::all(),
            'kondisiBangunan' => KondisiBangunan::all(),
            'sifatBangunan' => SifatBangunan::all(),
            'spekKategoriBangunan' => SpekKategoritBangunan::all(),
            'spekBangunan' => SpekBangunan::all(),
            'saranaPelengkap' => SaranaPelengkap::all(),
            'arahMataAngin' => ArahMataAngin::all(),
            'lantai' => Lantai::all(),
            'viewUnit' => ViewUnit::all(),
            'golMasySekitar' => GolonganMasySekitar::all(),
            'tingkatKeramaian' => TingkatKeramaian::all(),
            'laluLintasLokasi' => LaluLintasLokasi::all(),
            'jenisPesawat' => JenisPesawat::all(),
            'modelAlatBerat' => ModelAlatBerat::all(),
            'jenisKapal' => JenisKapal::all(),
            'jenisKendaraan' => JenisKendaraan::all(),
            'terletakArea' => TerletakArea::all(),
            'posisiUnit' => PosisiUnit::all(),
            'bentukUnit' => BentukUnit::all(),
            'fasilitasObjek' => FasilitasObjek::all(),
            'merupakanDaerah' => MerupakanDaerah::all(),
            'jenisUnit' => JenisUnit::all(),
            'jenisJaminan' => JenisJaminan::all(),
            'hubCadeb' => HubunganPemilikJaminan::all(),
            'hubPenghuni' => HubunganPenghuniJaminan::all(),
            'perkerasanJalan' => PerkerasanJalan::all(),
            'terletakDiArea' => TerletakArea::all(),
            'tujuanPenilaian' => TujuanPenilaian::all(),
            'perizinan' => Perizinan::all(),
            'foto' =>  FotoObjekJaminan::all()
        ];
    }

    private const HEADERS = [
        'bentuk-tanah' => ['Bentuk Tanah', 'bentuk-tanah'],
        'kontur-tanah' => ['Kontur Tanah', 'kontur-tanah'],
        'posisi-kavling' => ['Posisi Kavling', 'posisi-kavling'],
        'ketinggian-tanah' => ['Ketinggian Tanah', 'ketinggian-tanah'],
        'kondisi-fisik-tanah' => ['Kondisi Fisik Tanah', 'kondisi-fisik-tanah'],
        'jenis-bangunan' => ['Jenis Bangunan', 'jenis-bangunan'],
        'kondisi-bangunan' => ['Kondisi Bangunan', 'kondisi-bangunan'],
        'sifat-bangunan' => ['Sifat Bangunan', 'sifat-bangunan'],
        'sarana-pelengkap' => ['Sarana Pelengkap', 'sarana-pelengkap'],
        'lalu-lintas-lokasi' => ['Lalu Lintas Depan Lokasi', 'lalu-lintas-lokasi'],
        'tingkat-keramaian' => ['Tingkat Keramaian', 'tingkat-keramaian'],
        'gol-mas-sekitar' => ['Golongan Masyarakat Sekitar', 'gol-mas-sekitar'],
        'spek-kategori-bangunan' => ['Spek Kategori Bangunan', 'spek-kategori-bangunan'],
        'spek-bangunan' => ['Spek Bangunan', 'spek-bangunan'],
        'lantai-unit' => ['Lantai Unit', 'lantai-unit'],
        'view-unit' => ['View Unit', 'view-unit'],
        'perkerasan-jalan' => ['Perkerasan jalan', 'perkerasan-jalan'],
        'jenis-pesawat' => ['Jenis pesawat', 'jenis-pesawat'],
        'model-alat-berat' => ['Model alat berat', 'model-alat-berat'],
        'jenis-kapal' => ['Jenis kapal', 'jenis-kapal'],
        'jenis-kendaraan' => ['Jenis kendaraan', 'jenis-kendaraan'],
        'jenis-unit' => ['Jenis unit', 'jenis-unit'],
        'terletak-area' => ['Terletak di Area', 'terletak-area'],
        'merupakan-daerah' => ['Merupakan Daerah', 'merupakan-daerah'],
        'posisi-unit' => ['Posisi unit', 'posisi-unit'],
        'bentuk-unit' => ['Bentuk unit', 'bentuk-unit'],
        'fasilitas-objek' => ['Fasilitas Umum Dekat Objek', 'fasilitas-objek'],
        'foto-objek-jaminan' => ['Foto Objek Jaminan', 'foto-objek-jaminan'],
        'perizinan' => ['Perizinan', 'perizinan'],
    ];

}
