<?php

use Gregwar\Captcha\CaptchaBuilder;
use Jaga\Models\BaseModel;
use Jaga\Traits\JagaTimestamp;

/**
 * Class PancekInstansiToken
 * @property PancekInstansi $instansi
 */
class PancekInstansiToken extends BaseModel
{
    public $id;
    public $instansi_id;
    public $uuid;
    public $token;
    public $created_at;
    public $answered_at;

    public static $throwableModelName = 'Token Instansi PanCek';

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

    public function toDetail($columns = null)
    {
        $result = $this->toArray($columns);
        $result['instansi'] = null;
        if ($this->instansi) {
            $result['instansi'] = $this->instansi->getDetail(null, false);
        }

        return $result;
    }

    public function markUsed()
    {
        $this->answered_at = DateHelper::getNowTimezoned();
        if (!$this->save()) {
            throw new CustomErrorException(BaseResponse::UNEXPECTED_ERROR, "Token gagal diperbarui");
        }
    }

    public static function clearByInstansiId($instansiId)
    {
        $rows = PancekInstansiToken::find([
            'conditions' => 'instansi_id = :instansi_id:',
            'bind' => ['instansi_id' => $instansiId]
        ]);

        foreach ($rows as $row)
        {
            $row->delete();
        }
    }

    public static function findByInstansiId($instansiId)
    {
        /** @var $row PancekInstansiToken */
        $row = PancekInstansiToken::findFirst([
            'conditions' => 'instansi_id = :instansi_id:',
            'bind' => ['instansi_id' => $instansiId]
        ]);

        if (!$row) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Token tidak ditemukan");
        }

        return $row->toDetail();
    }

    public static function generateForInstansiId($instansiId)
    {
        $random = new \Phalcon\Security\Random();
        $builder = new CaptchaBuilder;
        $builder->build();
        $token = $builder->getPhrase();

        $row = new PancekInstansiToken();
        $row->instansi_id = $instansiId;
        $row->uuid = $random->uuid();
        $row->token = $token;
        if (!$row->save()) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Token gagal disimpan");
        }

        return $row;
    }

    public static function findByTokenEmail($tokenEmail)
    {
        $tokenUuid = explode("|", $tokenEmail);
        if (sizeof($tokenUuid) < 2) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Token tidak valid!");
        }
        $token = $tokenUuid[0];
        $uuid = $tokenUuid[1];

        /** @var $row PancekInstansiToken */
        $row = PancekInstansiToken::findFirst([
            'conditions' => 'token = :token: AND uuid = :uuid: AND answered_at IS NULL',
            'bind' => [
                'token' => $token,
                'uuid' => $uuid
            ]
        ]);

        if (!$row) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Token tidak valid!");
        }

        return $row;
    }
}
