<?php

use Jaga\Models\BaseModel;

/**
 * Class KeluhanDesaSipemandu
 * @property KeluhanDesaSipemanduAttachments[] $Attachments
 */
class KeluhanDesaSipemandu extends BaseModel {
    public $id;
    public $id_diskusi_bansos;
    public $nomor_tiket;
    public $nama_pelapor;
    public $email_pelapor;
    public $alamat_pelapor;
    public $id_provinsi;
    public $nama_provinsi;
    public $id_kota_kabupaten;
    public $nama_kota_kabupaten;
    public $id_kecamatan;
    public $nama_kecamatan;
    public $id_desa;
    public $nama_desa;
    public $created_at;
    public $updated_at;
    public $deleted_at;

    public function initialize()
    {
        $this->setSchema("jaga");
        $this->setSource("keluhan_desa_sipemandu");
        $this->belongsTo('id_diskusi_bansos', DiskusiBansos::class, 'id');
        $this->hasMany('id', KeluhanDesaSipemanduAttachments::class, 'id_keluhan_desa_sipemandu', ['alias' => 'Attachments']);
    }

    public static function findByNomorTiket($nomorTiket) {
        return self::findFirst([
            'conditions' => 'nomor_tiket = :nomor_tiket:',
            'bind' => ['nomor_tiket' => $nomorTiket],
        ]);
    }

    public static function findByIdDiskusiBansos($idDiskusiBansos) {
        return self::findFirst([
            'conditions' => 'id_diskusi_bansos = :id:',
            'bind' => ['id' => $idDiskusiBansos],
        ]);
    }

    public function toDetail() {
        $diskusiBansos = DiskusiBansos::findFirst($this->id_diskusi_bansos);
        if (!$diskusiBansos) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Detail Keluhan tidak ditemukan");
        }

        $diskusi = Diskusi::findFirst([
           'conditions' => 'id = :id:',
            'bind' => ['id' => $diskusiBansos->id_diskusi]
        ]);
        if (!$diskusi) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Detail Diskusi tidak ditemukan");
        }

        $result = $this->toArray([
            'nomor_tiket',
            'nama_pelapor',
            'email_pelapor',
            'alamat_pelapor',
            'id_provinsi',
            'nama_provinsi',
            'id_kota_kabupaten',
            'nama_kota_kabupaten',
            'id_kecamatan',
            'nama_kecamatan',
            'id_desa',
            'nama_desa',
            'created_at',
        ]);
        $result['title'] = $diskusi->title;
        $result['content'] = $diskusi->content;
        $result['nama_objek'] = count($diskusi->diskusiObjek) < 1 ? '-' : $diskusi->diskusiObjek[0]->nama_objek;
        $idTopik = ($diskusiBansos->id_topik == null ? '0' : $diskusiBansos->id_topik);
        $result['nama_topik'] = $idTopik == '0' ? '-' : $diskusiBansos->topikDiskusiBansos->deskripsi;

        $attachments = [];
        foreach ($this->Attachments as $attachment) {
            array_push($attachments, $attachment->toArray(['filename', 'type', 'url']));
        }
        $result['attachments'] = $attachments;

        $result['status'] = $diskusiBansos->status;
        $result['status_label'] = $this->getStatusLabel($diskusiBansos->status);

        /** @var Instansi $instansiAsal */
        $instansiAsal = Instansi::findFirst($diskusiBansos->id_instansi_origin);
        $instansiTl = Instansi::findFirst($diskusiBansos->id_instansi);
        $result['instansi_asal'] = null;
        $result['instansi_tl'] = null;
        if ($instansiAsal) {
            $result['instansi_asal'] = $instansiAsal->nama;
        }
        if ($instansiTl) {
            $result['instansi_tl'] = $instansiTl->nama;
        }

        $result['history'] = $this->getHistory($diskusiBansos->id);

        return $result;
    }

    public function saveAttachments($attachments) {
        if (!empty($attachments)) {
            foreach ($attachments as $attachment) {
                $attch = new KeluhanDesaSipemanduAttachments();
                $attch->id_keluhan_desa_sipemandu = $this->id;
                $attch->filename = $attachment['name'];
                $attch->type = $attachment['type'];
                $attch->url = $attachment['url'];
                if (!$attch->save()) {
                    $messages = [];
                    foreach ($attch->getMessages() as $error) {
                        $arr = [
                            'field' => $error->getField(),
                            'message' => $error->getMessage()
                        ];

                        array_push($messages, $arr);
                    }
                    throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Saving Keluhan Desa Attachments Error", $messages);
                }
            }
        }
    }

    private function getStatusLabel($status) {
        switch ($status) {
            case 1:
                $label = "Diterima";
                break;
            case 2:
                $label = "Diteruskan";
                break;
            case 3:
                $label = "Ditindaklanjuti";
                break;
            case 4:
                $label = "Selesai";
                break;
            case 5:
                $label = "Tidak Ada Respon Instansi TL";
                break;
            case 6:
                $label = "Tidak Ada Respon Pelapor";
                break;
            default:
                $label = "-";
                break;
        }

        return $label;
    }

    private function getHistory($idDiskusiBansos) {
        $diskusiHistory = DiskusiBansosHistory::query()
        ->columns("DiskusiBansosHistory.status, DiskusiComment.comment, Instansi.nama as instansi, DiskusiBansosHistory.created_at")
        ->leftJoin(DiskusiComment::class, "DiskusiBansosHistory.id_komentar = DiskusiComment.id")
        ->leftJoin(Instansi::class, "DiskusiBansosHistory.id_instansi = Instansi.id")
        ->where("DiskusiBansosHistory.id_diskusi_bansos = :id_diskusi_bansos:")
        ->orderBy("DiskusiBansosHistory.id asc")
        ->bind(['id_diskusi_bansos' => $idDiskusiBansos])
        ->execute()
        ->toArray();

        $result = [];
        foreach ($diskusiHistory as $history) {
            $arr = $history;
            $arr['status_label'] = $this->getStatusLabel($history['status']);
            array_push($result, $arr);
        }

        return $result;
    }
}
