<?php

use Phalcon\Mvc\Model\Query;
use Jaga\Traits\ThrowableModel;

class Instansi extends \Phalcon\Mvc\Model
{
    public $id;
    public $nama;
    public $id_provinsi;
    public $id_kota_kabupaten;
    public $show_to_public;
    public $created_at;
    public $updated_at;
    public $deleted_at;
    public $sumber;
    public $is_stranas;
    public $id_tipe;
    public $id_sub_tipe;
    public $flag_dana_desa;
    public $flag_pak;
    public $keluhan_tipe;
    public $kelompok_anggaran;
    public $nama_kelompok_anggaran;
    public $parent_id;

    use ThrowableModel;

    const SUMBER_KORSUPGAH = 1;

    //Constant for Instansi Name
    const KEMSOS_NAME = 'kementerian sosial';
    const KPK_NAME = 'komisi pemberantasan korupsi';
    const KEMENKOPUKM_NAME = 'kementerian koperasi dan usaha kecil dan menengah';
    const IRJENKEMKES_NAME = 'inspektur jenderal kementerian kesehatan';
    const BIROKOMYANMAS_NAME = 'biro komunikasi dan pelayanan masyarakat kementerian kesehatan';
    const BIROKOMDIKBUD_NAME = 'biro komunikasi dan humas kemendikbudristek ri';
    const IRJENKEMDIKBUD_NAME = 'irjen kemendikbudristek ri';
    const BPJS_KESEHATAN_NAME = 'BPJS Kesehatan';
    const DITJEN_BEA_CUKAI = 'Direktorat Jenderal Bea Cukai Kementerian Keuangan';
    const DITJEN_BINA_KONSTRUKSI_PUPR = 'Direktorat Jenderal Bina Konstruksi Kementerian PUPR';

    /**
     * Initialize method for model.
     */
    public function initialize()
    {
        $this->setSchema("jaga");
        $this->setSource("instansi");
        $this->hasMany('id', 'UmUser', 'id_instansi');
        $this->hasMany('id', 'StranasSurvey', 'id_instansi_satker');
        $this->hasMany('id', 'KorsupgahSurvey', 'id_instansi');
        $this->belongsTo('id_tipe', 'InstansiTipe', 'id');
        $this->belongsTo('id_sub_tipe', 'InstansiSubTipe', 'id');
        $this->hasManyToMany(
            'id',
            'InstansiProduk',
            'id_instansi',
            'id_produk',
            'Produk',
            'id_index'
        );
        $this->hasMany('id', 'KorwilPadTarget', 'id_instansi');
        $this->hasMany('id', 'KorwilAsetTarget', 'id_instansi');
        $this->hasMany('id', 'DiskusiBansos', 'id_instansi');
        $this->hasOne(
            'id_provinsi',
            MasterProvinsi::class,
            'provinsi_code'
        );
        $this->hasOne(
            'id_kota_kabupaten',
            MasterKotaKabupaten::class,
            'kota_kabupaten_code'
        );
    }

    public function toArray($columns = null)
    {
        $result = parent::toArray($columns);
        $result['instansi_tipe'] = $this->instansiTipe;
        $result['instansi_sub_tipe'] = $this->instansiSubTipe;
        $result['provinsi'] = $this->masterProvinsi;
        $result['kota_kabupaten'] = $this->masterKotaKabupaten;

        return $result;
    }

    public function toSimpleArray($columns = null)
    {
        $result = parent::toArray($columns);

        return $result;
    }

    public function toDetail()
    {
        $result = $this->toArray();
        $result['provinsi'] = $this->getMasterProvinsi();
        $result['kota_kabupaten'] = $this->getMasterKotaKabupaten();

        return $result;
    }

    public static function find($parameters = null)
    {
        return parent::find($parameters);
    }

    public function toArrayWithCityAndProvince($columns = null)
    {
        $result = $this->toArray($columns);

        if(!empty($this->id_kota_kabupaten)) {
            $kota_kabupaten = MasterKotaKabupaten::findFirst("kota_kabupaten_code = '".$this->id_kota_kabupaten."'");
            $result['kota_kabupaten'] = (!empty($kota_kabupaten)) ? $kota_kabupaten->toArray() : null;
        } else {
            $result['kota_kabupaten'] = null;
        }

        if(!empty($this->id_provinsi)) {
            $provinsi = MasterProvinsi::findFirst("provinsi_code = '".$this->id_provinsi."'");
            $result['provinsi'] = (!empty($provinsi)) ? $provinsi->toArray() : null;
        } else {
            $result['provinsi'] = null;
        }

        return $result;
    }

    public function getSekolahNpsn()
    {
        $npsn = [];
        if (empty($this->id_kota_kabupaten)) {
            if (empty($this->masterProvinsi)) {
                return [];
            }
            /** @var $provinsi MasterProvinsi */
            $provinsi = $this->masterProvinsi;

            $q = "SELECT npsn FROM Sekolah where ( LOWER(regexp_replace(provinsi, '[^a-zA-Z]','', 'g')) LIKE LOWER('%" . strtolower(preg_replace('/[^a-zA-Z]/', '', $provinsi->provinsi_name)) . "')";
            $dataWilayah = MasterNamaWilayah::find("kode = '".$this->id_provinsi."'");
            if ($dataWilayah->count() > 0) {
                foreach ($dataWilayah as $key => $wilayah) {
                    $q .= " OR LOWER(provinsi) LIKE '" . strtolower($wilayah->nama) . "'";
                }
            }
            // update 20210901, API detail sekolah dari Kemdikbud include kode dagri wilayah sekolah
            $q .= " OR kode_provinsi_dagri = '" . $provinsi->provinsi_code . "'";
        } else {
            $kota_kabupaten = MasterKotaKabupaten::findFirst("kota_kabupaten_code = '".$this->id_kota_kabupaten."'");
            $nama_kota_kab = !empty($kota_kabupaten) ? $kota_kabupaten->kota_kabupaten_name : '0';

            $q = "SELECT npsn FROM Sekolah where ( LOWER(regexp_replace(kota_kab, '[^a-zA-Z]','', 'g')) LIKE LOWER('%" . strtolower(preg_replace('/[^a-zA-Z]/', '', $nama_kota_kab)) . "')";
            $dataWilayah = MasterNamaWilayah::find("kode = '".$this->id_kota_kabupaten."'");
            if ($dataWilayah->count() > 0) {
                foreach ($dataWilayah as $key => $wilayah) {
                    $q .= " OR LOWER(kota_kab) LIKE '" . strtolower($wilayah->nama) . "'";
                }
            }
            // update 20210901, API detail sekolah dari Kemdikbud include kode dagri wilayah sekolah
            $q .= " OR kode_kabupaten_dagri = '" . $kota_kabupaten->kota_kabupaten_code . "'";
        }

        // update 20230223, provinsi Jakarta bisa lihat semua jenjang
        if ($this->id_provinsi == 31 && $this->id_tipe == 1) {
            $q .= " )";
        } else {
            $jenjangs = Jenjang::findByInstansiTipe($this->id_tipe);
            $arrJenjang = [];
            foreach ($jenjangs as $jenjang) {
                array_push($arrJenjang, $jenjang->id);
            }
            $q .= " ) AND jenjang_id IN(" . (sizeof($arrJenjang) > 0 ? implode(",", $arrJenjang) : "0") . ")";
        }
        $query = new Query(
            $q,
            $this->getDI()
        );

        $sekolah = $query->execute();

        if (count($sekolah) > 0) {
            foreach ($sekolah as $key => $item) {
                $npsn[] =  $item['npsn'];
            }
        }

        return $npsn;
    }

    public static function findFirstByNama($nama) {
        return self::findFirst([
            'conditions' => 'nama = :nama:',
            'bind' => [
                'nama' => $nama
            ]
        ]);
    }

    public static function findFirstDitjenBeaCukai() {
        return self::findFirstByNama(self::DITJEN_BEA_CUKAI);
    }

    public static function getIdInstansiDitjenBeaCukai()
    {
        $idInstansi = -1;
        $ditjenBeaCukai = self::findFirstDitjenBeaCukai();
        if($ditjenBeaCukai) {
            $idInstansi = $ditjenBeaCukai->id;
        }

        return $idInstansi;
    }

    public static function findFirstDitjenPupr() {
        return self::findFirstByNama(self::DITJEN_BINA_KONSTRUKSI_PUPR);
    }

    public static function getIdInstansiDitjenPupr() {
        $idInstansi = -1;
        $ditjenPupr = self::findFirstDitjenPupr();
        if($ditjenPupr) {
            $idInstansi = $ditjenPupr->id;
        }

        return $idInstansi;
    }
}
