<?php

class DesaService {
    private $context;
    /** @var OmspanMasterDesa $masterDesa */
    private $masterDesa;
    /** @var OmspanDanaDesaPagu */
    private $omspanDesa;

    #region PUBLIC
    public function __construct($context) {
        $this->context = $context;
    }

    public function profile($kodeDesa, $tahunAnggaran) {
        $desa = OmspanMasterDesa::findFirstByKodeDesa($kodeDesa);
        if ($desa) {
            $this->masterDesa = $desa;
            return $this->profileDesaFromMaster();
        } else {
            $params = [
                "kode_desa = :kode: and tahun = :tahun:",
                "bind" => [
                    "kode" => $kodeDesa,
                    "tahun" => $tahunAnggaran
                ]
            ];
            $desa = OmspanDanaDesaPagu::findFirst($params);
            if (!$desa) {
                throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, 'Desa not found');
            }
            $this->omspanDesa = $desa;
            $res = $desa->toJsonProfile();
            $res["luas"] = 0;
            $res["koordinat"] = [];
            $res["koordinat"]["lat"] = 0;
            $res["koordinat"]["long"] = 0;
            return $res;
        }
    }

    public function kkppd($kodeDesa)
    {
        if ($this->masterDesa) {
            $result = $this->masterDesa->kkppd;
        } else if ($this->omspanDesa) {
            $result = $this->omspanDesa->kkppd;
        } else {
            $desa = OmspanMasterDesa::findFirstByKodeDesa($kodeDesa);
            if($desa) {
                $this->masterDesa = $desa;
                $result = $desa->kkppd;
            } else {
                $desa = OmspanDanaDesaPagu::findFirstByKodeDesa($kodeDesa);
                if ($desa) {
                    $this->omspanDesa = $desa;
                    $result = $desa->kkppd;
                } else {
                    throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Data tidak ditemukan!");
                }
            }
        }

        return $result;
    }

    public function anggaran($kodeDesa, $tahunAnggaran, $isBlt = true) {
        if (!$this->masterDesa && !$this->omspanDesa) {
            /** @var OmspanMasterDesa $desa */
            $desa = OmspanMasterDesa::findFirstByKodeDesa($kodeDesa);

            if (!$desa) {
                $omspanDanaDesaPagu = OmspanDanaDesaPagu::findFirstByKodeDesa($kodeDesa);
                if (!$omspanDanaDesaPagu) {
                    throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, 'Desa not found');
                }
                $this->omspanDesa = $omspanDanaDesaPagu;
                $desa = OmspanMasterDesa::modelFromOmspanDanaDesaPagu($this->omspanDesa);
            }
            $this->masterDesa = $desa;
        } elseif(!$this->masterDesa && $this->omspanDesa) {
            $this->masterDesa = OmspanMasterDesa::modelFromOmspanDanaDesaPagu($this->omspanDesa);
        }

        $res = $this->masterDesa->jsonDetilAnggaran($tahunAnggaran, $isBlt);
        if (!$res) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_AVAILABLE, 'Data Tidak Tersedia');
        }

        return $res;
    }

    public function anggaranKumulatif($kodeDesa, $tahunAnggaran) {
        if (!$this->masterDesa && !$this->omspanDesa) {
            /** @var OmspanMasterDesa $desa */
            $desa = OmspanMasterDesa::findFirstByKodeDesa($kodeDesa);

            if (!$desa) {
                $omspanDanaDesaPagu = OmspanDanaDesaPagu::findFirstByKodeDesa($kodeDesa);
                if (!$omspanDanaDesaPagu) {
                    throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, 'Desa not found');
                }
                $this->omspanDesa = $omspanDanaDesaPagu;
                $desa = OmspanMasterDesa::modelFromOmspanDanaDesaPagu($this->omspanDesa);
            }
            $this->masterDesa = $desa;
        } elseif(!$this->masterDesa && $this->omspanDesa) {
            $this->masterDesa = OmspanMasterDesa::modelFromOmspanDanaDesaPagu($this->omspanDesa);
        }

        $res = $this->masterDesa->rincianAnggaran($tahunAnggaran);
        if (!$res) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_AVAILABLE, 'Data Tidak Tersedia');
        }

        return $res;
    }
    #endregion

    #region PRIVATE
    private function profileDesaFromMaster(): array
    {
        $res = $this->masterDesa->toJsonProfile();
        $res["luas"] = 0;
        $res["koordinat"] = [];
        $res["koordinat"]["lat"] = 0;
        $res["koordinat"]["long"] = 0;
        $koordinat = DesaKoordinat::findFirst(
            [
                "columns" => "koordinat_lintang, koordinat_bujur, luas",
                "provinsi = :provinsi: and kabupaten_kota = :kabupaten_kota: and kecamatan = :kecamatan: and desa_kelurahan = :desa_kelurahan:",
                "bind" => [
                    "provinsi" => $res["provinsi"],
                    "kabupaten_kota" => $res["kabupaten_kota"],
                    "kecamatan" => $res["kecamatan"],
                    "desa_kelurahan" => $res["desa_kelurahan"]
                ]
            ]
        );
        if ($koordinat) {
            $res["luas"] = $koordinat["luas"];
            $res["koordinat"]["lat"] = $koordinat["koordinat_lintang"];
            $res["koordinat"]["long"] = $koordinat["koordinat_bujur"];
        }

        return $res;
    }

    private function initDesa($kodeDesa) {
        $desa = OmspanMasterDesa::findFirstByKodeDesa($kodeDesa);
        if($desa) {
            $this->masterDesa = $desa;
        } else {
            $desa = OmspanDanaDesaPagu::findFirstByKodeDesa($kodeDesa);
            if ($desa) {
                $this->omspanDesa = $desa;
                $this->masterDesa = OmspanMasterDesa::modelFromOmspanDanaDesaPagu($this->omspanDesa);
            } else {
                throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Data tidak ditemukan!");
            }
        }
    }
    #endregion
}
