<?php

use Phalcon\Validation;
use Phalcon\Validation\Validator\Email as EmailValidator;
use Jaga\Traits\ThrowableModel;

/**
 * Class Sekolah
 * @property SekolahPegawai[] $SekolahPegawai
 */
class Sekolah extends \Phalcon\Mvc\Model
{
    use ThrowableModel;

    /**
     *
     * @var string
     */
    public $id;

    /**
     *
     * @var string
     */
    public $npsn;

    /**
     *
     * @var string
     */
    public $nama;

    /**
     *
     * @var string
     */
    public $alamat;

    /**
     *
     * @var string
     */
    public $no_telp;

    /**
     *
     * @var string
     */
    public $email;

    /**
     *
     * @var string
     */
    public $kepsek;

    /**
     *
     * @var string
     */
    public $provinsi;

    /**
     *
     * @var string
     */
    public $kota_kab;

    /**
     *
     * @var string
     */
    public $kecamatan;

    /**
     *
     * @var string
     */
    public $akreditasi;

    /**
     *
     * @var integer
     */
    public $available_photo;

    /**
     *
     * @var string
     */
    public $latitude;

    /**
     *
     * @var string
     */
    public $longitude;

    /**
     *
     * @var integer
     */
    public $no_urut_internal;

    /**
     *
     * @var string
     */
    public $usia;

    /**
     *
     * @var string
     */
    public $nsm;

    /**
     *
     * @var integer
     */
    public $seen;

    /**
     *
     * @var integer
     */
    public $id_lapor;

    /**
     *
     * @var string
     */
    public $token_lapor;

    /**
     *
     * @var string
     */
    public $produk_id;

    /**
     *
     * @var string
     */
    public $sekolah_id;

    /**
     *
     * @var string
     */
    public $nama_1;

    /**
     *
     * @var string
     */
    public $npsn_1;

    /**
     *
     * @var integer
     */
    public $kode_pos;

    /**
     *
     * @var string
     */
    public $kode_wilayah;

    /**
     *
     * @var string
     */
    public $bentuk_pendidikan;

    /**
     *
     * @var string
     */
    public $kurikulum;

    /**
     *
     * @var integer
     */
    public $daya_listrik;

    /**
     *
     * @var string
     */
    public $luas_tanah_bukan_milik;

    /**
     *
     * @var string
     */
    public $luas_tanah_milik;

    /**
     *
     * @var string
     */
    public $nama_dusun;

    /**
     *
     * @var string
     */
    public $desa_kelurahan;

    /**
     *
     * @var string
     */
    public $nomor_fax;

    /**
     *
     * @var string
     */
    public $npwp;

    /**
     *
     * @var integer
     */
    public $tahun_ajaran_id;

    /**
     *
     * @var integer
     */
    public $lab_bahasa;

    /**
     *
     * @var integer
     */
    public $lab_biologi;

    /**
     *
     * @var integer
     */
    public $lab_fisika;

    /**
     *
     * @var integer
     */
    public $lab_ipa;

    /**
     *
     * @var integer
     */
    public $lab_ips;

    /**
     *
     * @var integer
     */
    public $lab_kimia;

    /**
     *
     * @var integer
     */
    public $pd;

    /**
     *
     * @var integer
     */
    public $pd_laki;

    /**
     *
     * @var integer
     */
    public $pd_perempuan;

    /**
     *
     * @var integer
     */
    public $pd_tingkat1;

    /**
     *
     * @var integer
     */
    public $pd_tingkat10;

    /**
     *
     * @var integer
     */
    public $pd_tingkat11;

    /**
     *
     * @var integer
     */
    public $pd_tingkat12;

    /**
     *
     * @var integer
     */
    public $pd_tingkat13;

    /**
     *
     * @var integer
     */
    public $pd_tingkat2;

    /**
     *
     * @var integer
     */
    public $pd_tingkat3;

    /**
     *
     * @var integer
     */
    public $pd_tingkat4;

    /**
     *
     * @var integer
     */
    public $pd_tingkat5;

    /**
     *
     * @var integer
     */
    public $pd_tingkat6;

    /**
     *
     * @var integer
     */
    public $pd_tingkat7;

    /**
     *
     * @var integer
     */
    public $pd_tingkat8;

    /**
     *
     * @var integer
     */
    public $pd_tingkat9;

    /**
     *
     * @var integer
     */
    public $perpus_baik;

    /**
     *
     * @var integer
     */
    public $perpus_rusak_berat;

    /**
     *
     * @var integer
     */
    public $perpus_rusak_ringan;

    /**
     *
     * @var integer
     */
    public $perpus_rusak_sedang;

    /**
     *
     * @var integer
     */
    public $rk_baik;

    /**
     *
     * @var integer
     */
    public $rk_rusak_berat;

    /**
     *
     * @var integer
     */
    public $rk_rusak_ringan;

    /**
     *
     * @var integer
     */
    public $rk_rusak_sedang;

    /**
     *
     * @var integer
     */
    public $rombel;

    /**
     *
     * @var integer
     */
    public $rombel_1;

    /**
     *
     * @var integer
     */
    public $rombel_10;

    /**
     *
     * @var integer
     */
    public $rombel_11;

    /**
     *
     * @var integer
     */
    public $rombel_12;

    /**
     *
     * @var integer
     */
    public $rombel_13;

    /**
     *
     * @var integer
     */
    public $rombel_2;

    /**
     *
     * @var integer
     */
    public $rombel_3;

    /**
     *
     * @var integer
     */
    public $rombel_4;

    /**
     *
     * @var integer
     */
    public $rombel_5;

    /**
     *
     * @var integer
     */
    public $rombel_6;

    /**
     *
     * @var integer
     */
    public $rombel_7;

    /**
     *
     * @var integer
     */
    public $rombel_8;

    /**
     *
     * @var integer
     */
    public $rombel_9;

    /**
     *
     * @var string
     */
    public $rt;

    /**
     *
     * @var string
     */
    public $rw;

    /**
     *
     * @var integer
     */
    public $sanitasi_guru;

    /**
     *
     * @var integer
     */
    public $sanitasi_siswa;

    /**
     *
     * @var integer
     */
    public $semester_id;

    /**
     *
     * @var string
     */
    public $sertifikasi_iso;

    /**
     *
     * @var string
     */
    public $sinkron_terakhir;

    /**
     *
     * @var string
     */
    public $status_sekolah;

    /**
     *
     * @var string
     */
    public $sumber_listrik;

    /**
     *
     * @var integer
     */
    public $guru_agama_budi_pekerti;

    /**
     *
     * @var integer
     */
    public $guru_bahasa_indonesia;

    /**
     *
     * @var integer
     */
    public $guru_bahasa_inggris;

    /**
     *
     * @var integer
     */
    public $guru_belums1;

    /**
     *
     * @var integer
     */
    public $guru_belumsertifikasi;

    /**
     *
     * @var integer
     */
    public $guru_gol1;

    /**
     *
     * @var integer
     */
    public $guru_gol2;

    /**
     *
     * @var integer
     */
    public $guru_gol3;

    /**
     *
     * @var integer
     */
    public $guru_gtt;

    /**
     *
     * @var integer
     */
    public $guru_sejarah_indonesia;

    /**
     *
     * @var integer
     */
    public $jml_lab;

    /**
     *
     * @var integer
     */
    public $guru_gty;

    /**
     *
     * @var integer
     */
    public $guru_kelas;

    /**
     *
     * @var integer
     */
    public $guru_laki;

    /**
     *
     * @var integer
     */
    public $guru_matematika;

    /**
     *
     * @var integer
     */
    public $guru_penjaskes;

    /**
     *
     * @var integer
     */
    public $guru_perempuan;

    /**
     *
     * @var integer
     */
    public $guru_pkn;

    /**
     *
     * @var integer
     */
    public $guru_pns;

    /**
     *
     * @var integer
     */
    public $guru_s1lebih;

    /**
     *
     * @var integer
     */
    public $guru_seni_budaya;

    /**
     *
     * @var integer
     */
    public $guru_sertifikasi;

    /**
     *
     * @var integer
     */
    public $jml_perpus;

    /**
     *
     * @var integer
     */
    public $jml_rk;

    /**
     *
     * @var integer
     */
    public $jml_sanitasi;

    /**
     *
     * @var string
     */
    public $waktu_penyelenggaraan;

    /**
     *
     * @var string
     */
    public $website;

    /**
     *
     * @var string
     */
    public $nss;

    /**
     *
     * @var string
     */
    public $akses_internet;

    /**
     *
     * @var integer
     */
    public $guru_gol4;

    /**
     *
     * @var integer
     */
    public $guru_gol3_1;

    /**
     *
     * @var integer
     */
    public $id_area_lapor;

    /**
     *
     * @var string
     */
    public $periode_aktif;

    /**
     *
     * @var integer
     */
    public $laboratorium;

    /**
     *
     * @var string
     */
    public $tanggal_update_sekolah;

    /**
     *
     * @var integer
     */
    public $guru_honor;

    /**
     *
     * @var integer
     */
    public $data_kosong;

    /**
     *
     * @var integer
     */
    public $guru_kurang_30_th;

    /**
     *
     * @var integer
     */
    public $guru_31_35_th;

    /**
     *
     * @var integer
     */
    public $guru_36_40_th;

    /**
     *
     * @var integer
     */
    public $guru_41_45_th;

    /**
     *
     * @var integer
     */
    public $guru_46_50_th;

    /**
     *
     * @var integer
     */
    public $guru_51_55_th;

    /**
     *
     * @var integer
     */
    public $guru_lebih_55_th;

    /**
     *
     * @var integer
     */
    public $sanitasi_guru_baik;

    /**
     *
     * @var integer
     */
    public $sanitasi_guru_rusak_ringan;

    /**
     *
     * @var integer
     */
    public $sanitasi_guru_rusak_berat;

    /**
     *
     * @var integer
     */
    public $sanitasi_siswa_baik;

    /**
     *
     * @var integer
     */
    public $sanitasi_siswa_rusak_sedang;

    /**
     *
     * @var integer
     */
    public $sanitasi_siswa_rusak_berat;

    /**
     *
     * @var string
     */
    public $bentuk;

    /**
     *
     * @var integer
     */
    public $jenjang_id;

    /**
     *
     * @var string
     */
    public $kecamatan_code;

    public $last_update_pegawai;

    /**
     * Validations and business logic
     *
     * @return boolean
     */

    /**
     * Define Constant for Madrasah
     */
    const MADRASAH_JENJANG_MAS = "MAS";
    const MADRASAH_JENJANG_MAN = "MAN";
    const MADRASAH_JENISDATA_PROFIL = "lbg";
    const MADRASAH_JENISDATA_SARPRAS = "sarpras";
    const MADRASAH_JENISDATA_SANITASI = "sanitasi";
    const MADRASAH_JENISDATA_BOS = "bos";

    public function validation()
    {
        $validator = new Validation();

        $validator->add(
            'email',
            new EmailValidator(
                [
                    'model'   => $this,
                    'message' => 'Please enter a correct email address',
                    "allowEmpty" => true
                ]
            )
        );

        return $this->validate($validator);
    }

    /**
     * Initialize method for model.
     */
    public function initialize()
    {
        $this->setSchema("jaga");
        $this->setSource("sekolah");
        $this->belongsTo('jenjang_id', '\Jenjang', 'id', ['alias' => 'Jenjang']);
        $this->belongsTo('kecamatan_code', '\MasterKecamatan', 'kecamatan_code', ['alias' => 'MasterKecamatan']);
        $this->hasOne('npsn', \Jaga\Models\UsersSekolah::class, 'npsn', ['alias' => 'UsersSekolah']);
        $this->hasMany('npsn', \Jaga\Models\PAK\PAKIsianSekolah::class, 'sekolah_npsn', ['alias' => 'PAKIsianSekolah']);
        $this->hasMany('npsn', SekolahPegawai::class, 'npsn', ['alias' => 'SekolahPegawai']);
    }

    /**
     * Returns table name mapped in the model.
     *
     * @return string
     */
    public function getSource()
    {
        return 'sekolah';
    }

    /**
     * Allows to query a set of records that match the specified conditions
     *
     * @param mixed $parameters
     * @return Sekolah[]|Sekolah|\Phalcon\Mvc\Model\ResultSetInterface
     */
    public static function find($parameters = null)
    {
        return parent::find($parameters);
    }

    /**
     * Allows to query the first record that match the specified conditions
     *
     * @param mixed $parameters
     * @return Sekolah|\Phalcon\Mvc\Model\ResultInterface
     */
    public static function findFirst($parameters = null)
    {
        return parent::findFirst($parameters);
    }

    public function search($keyword, $nama, $npsn, $kota, $provinsi, $limit, $offset)
	{
        $queryBuilder = $this->modelsManager->createBuilder()
        ->columns('*')
        ->from('jaga.Sekolah');

        $whereDefined = false;
        if(empty($keyword)) {
            !empty($nama) && $this->addWhere($queryBuilder, $whereDefined, 'nama', $nama);
            !empty($npsn) && $this->addWhere($queryBuilder, $whereDefined, 'npsn', $npsn);
            !empty($kota) && $this->addWhere($queryBuilder, $whereDefined, 'kota_kab', $kota);
            !empty($provinsi) && $this->addWhere($queryBuilder, $whereDefined, 'provinsi', $provinsi);
		} else {
            $queryBuilder
            ->where(
                'lower(nama) like :keyword: or lower(npsn) like :keyword: or lower(kota_kab) like :keyword: or lower(provinsi) like :keyword:',
                array(
                    'keyword' => '%'.strtolower($keyword).'%'
                )
            );
		}

        return $queryBuilder->limit($limit)->offset($offset)
        ->getQuery()
        ->execute();
    }



    private function addWhere($queryBuilder, $whereDefined, $field, $fieldValue)
    {
        $where = 'lower('.$field.') like :'.$field.':';
        $bindArray = [$field => '%'.strtolower($fieldValue).'%'];
        if( $whereDefined ){
            $queryBuilder->andWhere($where, $bindArray);
        }else{
            $queryBuilder->where($where, $bindArray);
            $whereDefined = true;
        }
    }

    public function toArray($columns = null)
    {
        $result = parent::toArray($columns);
        $result['jenjang'] = is_null($this->jenjang_id) ? null : $this->Jenjang->toArray(['nama_jenjang']);

        return $result;
    }

    public function toSimpleArray($columns = null)
    {
        $default_columns = [
            'id',
            'npsn',
            'nama',
            'alamat',
            'no_telp',
            'email',
            'kode_provinsi_dagri',
            'provinsi',
            'kode_kabupaten_dagri',
            'kota_kab',
            'kecamatan',
            'jenjang_id'
        ];
        $columns = is_null($columns) ? $default_columns : $columns;
        $result = parent::toArray($columns);
        $result['jenjang'] = is_null($this->jenjang_id) ? null : $this->Jenjang->toArray();

        return $result;
    }
}
