<?php

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

/**
 * Class PancekPerson
 * @property UmUser $umUser
 * @property PancekInstansi $instansi
 */
class PancekUser extends BaseModel
{
    use JagaTimestamp, SoftDelete;

    public $id;
    public $um_id;
    public $instansi_id;
    public $jabatan;
    public $created_at;
    public $updated_at;
    public $deleted_at;

    public static $throwableModelName = 'PancekUser';

    public function initialize()
    {
        $this->setSchema("jaga");
        $this->setSource("pancek_user");
        $this->belongsTo(
            "um_id",
            \UmUser::class,
            "um_id",
            [
                'reusable' => true, // cache related data
                'alias'    => 'umUser',
            ]
        );
        $this->belongsTo(
            "instansi_id",
            \PancekInstansi::class,
            "id",
            [
                'reusable' => true, // cache related data
                'alias'    => 'instansi',
            ]
        );
    }

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

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

        if ($withInstansi) {
            $result['instansi'] = null;
            if ($this->instansi) {
                $result['instansi'] = $this->instansi->getDetail(null, false);
            }
        }

        if ($withUmUser) {
            $result['um_user'] = null;
            if ($this->umUser) {
                $result['um_user'] = $this->umUser->baseToArray();
            }
        }

        return $result;
    }

    public static function findByUmId($id, $getDetail = true)
    {
        /** @var $pancekUser PancekUser */
        $pancekUser = PancekUser::findFirst([
            'conditions' => 'um_id = :id:',
            'bind' => ['id' => $id]
        ]);
        if (!$pancekUser) throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "User Pancek tidak ditemukan");

        $res = $pancekUser;
        if ($getDetail) {
            $res = $pancekUser->getDetail();
        }
        return $res;
    }

    public function deletion() {
        /** @var PancekInstansi $pancekInstansi */
        $pancekInstansi = PancekInstansi::findFirst(['conditions' => 'id = :id: AND deleted_at IS NULL', 'bind' => ['id' => $this->instansi_id]]);
        if (!$pancekInstansi) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Instansi PanCek tidak ditemukan.");
        }
        /** @var PancekFormulir[] $pancekFormulir */
        $pancekFormulir = PancekFormulir::find(['conditions' => 'instansi_id = :id: AND deleted_at IS NULL', 'bind' => ['id' => $pancekInstansi->id]]);

        if (!$this->delete()) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Gagal menghapus User PanCek.");
        }

        if (!$pancekInstansi->markDeleted()) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Gagal menghapus Instansi PanCek.");
        }

        foreach ($pancekFormulir as $formulir) {
            if (!$formulir->delete()) {
                throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Gagal menghapus Formulir PanCek.");
            }
        }
    }
}
