<?php

namespace Jaga\Models\PAK;

use Jaga\Models\BaseModel;
use Jaga\Traits\JagaTimestamp;
use Jaga\Traits\SoftDelete;
use Phalcon\Mvc\Model\Query;
use Jaga\Models\PAK\PAKQuestionnaire;
use Jaga\Models\PAK\PAKImplementasiVerifikasi;
use Jaga\Models\PAK\PAKImplementasiAttachment;

class PAKImplementasi extends BaseModel
{
    use JagaTimestamp, SoftDelete;

    const STATUS_DRAFT = 1;
    const STATUS_SUBMITTED = 2;
    const STATUS_VERIFIED = 3;
    const STATUS_RETURNED = 4;

    public static $throwableModelName = 'Implementasi PAK';

    public $id;
    public $instansi_id;
    public $created_at;
    public $created_by;
    public $updated_at;
    public $updated_by;
    public $deleted_at;
    public $deleted_by;
    public $status;
    public $returned_notes;
    public $returned_at;
    public $returned_by;

    public function initialize()
    {
        $this->setSchema("jaga");
        $this->setSource("pak_implementasi");
        $this->hasMany(
            "id",
            "Jaga\Models\PAK\PAKImplementasiVerifikasi",
            "implementasi_id",
            [
                'reusable' => true, // cache related data
                'alias'    => 'verifications',
            ]
        );

        $this->belongsTo(
            "instansi_id",
            \Instansi::class,
            "id",
            [
                'reusable' => true, // cache related data
                'alias'    => 'instansi',
            ]
        );
    }

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

        return $result;
    }

    public function getId()
    {
        return $this->id;
    }

    public function getDetail($completeData = true)
    {
        $result = $this->toArray();

        switch ($this->status) {
            case self::STATUS_DRAFT:
                $result['status'] = 'Draft';
                break;
            case self::STATUS_SUBMITTED:
                $result['status'] = 'On Progress';
                break;
            case self::STATUS_VERIFIED:
                $result['status'] = 'Verified';
                break;
            case self::STATUS_RETURNED:
                $result['status'] = 'Returned';
                break;

            default:
                $result['status'] = 'Unknown';
                break;
        }

        $instansi = $this->instansi;
        $result['nama_instansi'] = empty($instansi) ? '-' : $instansi->nama;
        $result['returned_by_nama'] = '-';
        if (!is_null($result['returned_by'])) {
            $returnBy = \UmUser::findFirst($result['returned_by']);
            if($returnBy) $result['returned_by_nama'] = $returnBy->nama;
        }

        $verified_by = '-';
        $verifications = $this->verifications;
        $verificationColums = [
            'id',
            'questionnaire_id',
            'implementasi_id',
            'nilai_verifikasi',
            'verified_by',
            'verified_at',
        ];

        $tmp = [];
        $counter = 0;
        $total = 0;

        foreach ($verifications as $key => $v) {
            $verification = $v->getDetail($verificationColums);
            array_push($tmp, $verification);
            $counter++;
            $total += $verification['nilai_verifikasi'];
            if (!empty($verification['verified_by'])) {
                $verified_by = $verification['verified_by'];
            }
        }

        if ($verified_by !== '-') {
            $query = new Query(
                'SELECT nama FROM jaga.UmUser where um_id=' . $verified_by,
                $this->getDI()
            );

            $users = $query->execute();
            $verified_by = $users[0]['nama'];
        }

        $result['verified_by'] = $verified_by;
        if ($counter > 0) {
            $result['verification_means'] = number_format($total / $counter, 2, ",", ".");
        } else {
            $result['verification_means'] = 0;
        }


        if ($completeData) {
            $result['verifications'] = $tmp;
        }

        return $result;
    }

    public function syncVerifications($verification_ids)
    {
        $verifications = PAKImplementasiVerifikasi::find([
            'conditions' => 'implementasi_id = :id:',
            'bind' => ['id' => $this->id]
        ]);

        if ($verifications->count() > 0) {
            //dd($verifications);
            foreach ($verifications as $ver) {
                if (!in_array($ver->id, $verification_ids)) {
                    $ver->forceDelete();
                }
            }
        }
    }

    public function beforeDelete()
    {
        $verifications = PAKImplementasiVerifikasi::find([
            'conditions' => 'implementasi_id = :id:',
            'bind' => ['id' => $this->id]
        ]);

        if ($verifications->count() > 0) {
            foreach ($verifications as $v) {
                $v->forceDelete();
            }
        }
    }
}

