<?php

use Jaga\Models\BaseModel;
use Jaga\Traits\JagaTimestamp;
use Jaga\Traits\SoftDelete;

/**
 * Class PancekInstansi
 * @property PancekJenisInstansi $jenisInstansi
 * @property PancekSektorUsaha $sektorUsaha
 * @property PancekUser $user
 * @property MasterProvinsi $provinsi
 * @property MasterKotaKabupaten $kabKota
 * @property PancekKppbc $kppbc
 */
class PancekInstansi extends BaseModel
{
    use JagaTimestamp, SoftDelete;

    public $id;
    public $npwp;
    public $nomor;
    public $nib;
    public $jenis_instansi_id;
    public $sektor_usaha_id;
    public $sektor_usaha_nama;
    public $nama;
    public $provinsi_id;
    public $kab_kota_id;
    public $alamat;
    public $telepon;
    public $email;
    public $foto;
    public $status;
    public $created_at;
    public $updated_at;
    public $deleted_at;
    public $verified_at;
    public $verified_by;
    public $ceklis_kepentingan;
    public $kppbc_id;

    public static $throwableModelName = 'Instansi PanCek';

    const STATUS_REGISTERED = 'REGISTERED';
    const STATUS_VERIFIED   = 'VERIFIED';

    const CEKLIST_KEPENTINGAN_BK = '1;0;0';
    const CEKLIST_KEPENTINGAN_BC = '0;1;0';

    public function initialize()
    {
        $this->setSchema("jaga");
        $this->setSource("pancek_instansi");
        $this->belongsTo(
            "jenis_instansi_id",
            \PancekJenisInstansi::class,
            "id",
            [
                'reusable' => true, // cache related data
                'alias'    => 'jenisInstansi',
            ]
        );
        $this->belongsTo(
            "sektor_usaha_id",
            \PancekSektorUsaha::class,
            "id",
            [
                'reusable' => true, // cache related data
                'alias'    => 'sektorUsaha',
            ]
        );
        $this->hasOne(
            'id',
            \PancekUser::class,
            'instansi_id',
            [
                'reusable' => true, // cache related data
                'alias'    => 'user',
                'params'   => [
                    'conditions' => 'deleted_at IS NULL'
                ],
            ]
        );
        $this->belongsTo(
            "provinsi_id",
            \MasterProvinsi::class,
            "provinsi_code",
            [
                'reusable' => true, // cache related data
                'alias'    => 'provinsi',
            ]
        );
        $this->belongsTo(
            "kab_kota_id",
            \MasterKotaKabupaten::class,
            "kota_kabupaten_code",
            [
                'reusable' => true, // cache related data
                'alias'    => 'kabKota',
            ]
        );
        $this->belongsTo(
            "kppbc_id",
            PancekKppbc::class,
            "id",
            [
                'reusable' => true, // cache related data
                'alias'    => 'kppbc',
            ]
        );
    }

    public function toArray($columns = null)
    {
        return parent::toArray($columns);
    }

    public function getDetail($columns = null, $withUser = true)
    {
        $result = $this->toArray($columns);

        $result['jenis_instansi'] = null;
        if ($this->jenisInstansi) {
            $result['jenis_instansi'] = $this->jenisInstansi->toArray(['id', 'nama']);
        }

        $result['sektor_usaha'] = null;
        if ($this->sektorUsaha) {
            $result['sektor_usaha'] = $this->sektorUsaha->toArray(['id', 'nama']);
        }

        if ($withUser) {
            $result['user'] = null;
            if ($this->user) {
                $result['user'] = $this->user->getDetail(['id', 'jabatan'], false);
            }
        }

        $result['provinsi'] = null;
        if ($this->provinsi) {
            $result['provinsi'] = $this->provinsi->toArray(['provinsi_code', 'provinsi_name']);
        }

        $result['kab_kota'] = null;
        if ($this->kabKota) {
            $result['kab_kota'] = $this->kabKota->toArray(['provinsi_code', 'kota_kabupaten_code', 'kota_kabupaten_name']);
        }

        return $result;
    }

    public function markDeleted() {
        $time = time();

        // mark email
        $arr = explode("@", $this->email);
        $res = $this->email;
        if (count($arr) === 2) {
            $res = $this->markFieldDeleted($arr[0], $time) . "@" . $arr[1];
        }
        $this->email = $res;

        // mark npwp
        $this->npwp = $this->markFieldDeleted($this->npwp, $time);

        $this->save();

        return $this->delete();
    }

    private function markFieldDeleted($fieldValue, $time) {
        return $fieldValue . ".deleted." . $time;
    }
}
