<?php

class Diskusi extends \Phalcon\Mvc\Model
{

    /**
     *
     * @var integer
     */
    public $id;

    /**
     *
     * @var string
     */
    public $title;

    /**
     *
     * @var string
     */
    public $content;

    /**
     *
     * @var integer
     */
    public $user_id;

    /**
     *
     * @var integer
     */
    public $tenant_id;

    /**
     *
     * @var string
     */
    public $proof_url;

    /**
     *
     * @var string
     */
    public $generated_url;

    /**
     *
     * @var integer
     */
    public $is_anonymous;

    /**
     *
     * @var integer
     */
    public $kategori_diskusi_id;

    /**
     *
     * @var string
     */
    public $uuid;

    /**
     *
     * @var string
     */
    public $created_at;

    /**
     *
     * @var string
     */
    public $updated_at;

    /**
     *
     * @var string
     */
    public $link_terkait;

    /**
     *
     * @var integer
     */
    public $is_deleted;

    /**
     *
     * @var integer
     */
    public $type;

    public const TYPE_DISKUSI = 0;
    public const TYPE_BERITA = 1;
    public const TYPE_KELUHAN = 2;
    /**
     * @var string
     */
    public $title_en;
    /**
     * @var string
     */
    public $content_en;

    /**
     * Initialize method for model.
     */
    public function initialize()
    {
        $this->setSchema("jaga");
        $this->setSource("diskusi");
        $this->hasMany('id', 'DiskusiAttachment', 'diskusi_id');
        $this->hasMany('id', 'DiskusiMentionUser', 'diskusi_id');
        $this->hasMany('id', 'DiskusiObjek', 'diskusi_id');
        $this->hasMany('id', 'DiskusiComment', 'diskusi_id');
        $this->hasMany('id', 'DiskusiLike', 'diskusi_id');
        $this->hasMany('id', 'DiskusiLapor', 'id_diskusi');
        $this->hasOne('id', 'DiskusiBansos', 'id_diskusi');
        $this->belongsTo('user_id', 'UmUser', 'um_id', ["alias" => "umUser", "params" => ["conditions" => "is_active = true"]]);
        $this->belongsTo('kategori_diskusi_id', 'KategoriDiskusi', 'id', ["alias" => "kategori"]);
        $this->hasManyToMany(
            'id',
            BeritaTags::class,
            'id_diskusi', 'id_tags',
            Tags::class,
            'id'
        );
    }

    /**
     * Returns table name mapped in the model.
     *
     * @return string
     */
    public function getSource()
    {
        return 'diskusi';
    }

    /**
     * Allows to query a set of records that match the specified conditions
     *
     * @param mixed $parameters
     * @return Diskusi[]|Diskusi|\Phalcon\Mvc\Model\ResultSetInterface
     */
    public static function find($parameters = null)
    {
        return parent::find($parameters);
    }

    /**
     * Allows to query the first record that match the specified conditions
     *
     * @param mixed $parameters
     * @return Diskusi|\Phalcon\Mvc\Model\ResultInterface
     */
    public static function findFirst($parameters = null)
    {
        return parent::findFirst($parameters);
    }

    public function toJsonForDetail($columns = null, $profilePictureBaseUrl, $config, $minio)
    {
        $result = $this->toArray([
            'id',
            'title',
            'title_en',
            'created_at',
            'updated_at',
            'release_date',
            'content',
            'content_en',
            'link_terkait',
            'is_anonymous',
            'is_deleted',
            'views',
            'is_attachment_public',
            'type'
        ]);

        if ($result['is_anonymous'] === 1) {
            if ($result['type'] == 1) $result['nama'] = "Tim JAGA KPK";
            else $result['nama'] = "Anonim";
            $result["profile_picture_url"] = null;
        } else {
            if (!empty($this->umUser)) {
                $result['nama'] = $this->umUser->um_user_name;
                $result["profile_picture_url"] = MediaHelper::getPresignedUrlFoto($this->umUser->toArray(), UmUser::class, $config, $minio);
            } else {
                $result['nama'] = 'Akun ini telah dihapus';
                $result["profile_picture_url"] = null;
            }
        }

        $result['uuid_user'] = empty($this->umUser) || $result['is_anonymous'] === 1 ? '' : $this->umUser->uuid_user;
        $result['jenis_kelamin'] = $this->umUser->jenis_kelamin ?? '-';
        $result['um_id'] = empty($this->umUser) || $result['is_anonymous'] === 1 ? null : $this->umUser->um_id;
        $result['checkmark_verified'] = empty($this->umUser) || $result['is_anonymous'] === 1 ? null : $this->umUser->checkmark_verified;
        $result['is_banned'] = $this->umUser->is_banned ?? false;
        // if (!empty($this->diskusiLapor->id_user_terlapor)) {
        //     $result['laporan_user'] = $this->diskusiLapor->toArray();
        // }
        if (!empty($this->umUser)) {
            $result['laporan_user'] = DiskusiLapor::findFirst([
                "id_user_terlapor = :id_terlapor: AND status=:status: AND id_user_terlapor is NOT NULL AND deleted_at IS NULL",
                "bind" => [
                    'id_terlapor' => $this->umUser->um_id,
                    'status' => DiskusiLapor::STATUS_DISETUJUI
                ]
            ]);
        } else {
            $result['laporan_user'] = null;
        }

        if ((!empty($result['laporan_user']) && $result['laporan_user']->status === DiskusiLapor::STATUS_DISETUJUI) || $result['is_banned']) {
            $result['title'] = '-';
            $result['content'] = '-';
            $result['is_anonymous'] = 0;
            $result['is_blocked'] = 1;
        }

        $result['nama_objek'] = count($this->diskusiObjek) < 1 ? '-' : $this->diskusiObjek[0]->nama_objek;
        $result['id_objek'] = count($this->diskusiObjek) < 1 ? '0' : $this->diskusiObjek[0]->objek_id;
        $result['objek_type'] = count($this->diskusiObjek) < 1 ? '0' : $this->diskusiObjek[0]->objek_type;
        $result['id_topik'] = $this->diskusiBansos == null ? '0' : ($this->diskusiBansos->id_topik == null ? '0' : $this->diskusiBansos->id_topik);
        $result['id_diskusi_bansos'] = empty($this->diskusiBansos) ? null : $this->diskusiBansos->id;
        $result['id_instansi_diskusi_bansos'] = empty($this->diskusiBansos) ? null : $this->diskusiBansos->id_instansi;
        $result['nama_topik'] = $result['id_topik'] == '0' ? '-' : $this->diskusiBansos->topikDiskusiBansos->deskripsi;

        $result['mentions'] = [];
        $uniqueUsersId = [];
        foreach ($this->diskusiMentionUser as $key => $mention) {
            if (!empty($mention->umUser) && !in_array($mention->umUser->um_id, $uniqueUsersId) && $mention->umUser->is_active) {
                $result['mentions'][] = [
                    'nama' => $mention->umUser->um_user_name,
                    'uuid_user' => $mention->umUser->uuid_user,
                    "profile_picture_url" => MediaHelper::getPresignedUrlFoto($mention->umUser->toArray(), UmUser::class, $config, $minio)
                ];
                $uniqueUsersId[] = $mention->umUser->um_id;
            }
        }

        if ($result['is_attachment_public'] === 1 && !empty($this->umUser)) {
            foreach ($this->diskusiAttachment as $key => $attachment) {
                $result['attachments'][] = [
                    'uuid' => $attachment->uuid,
                    "filename" => $attachment->filename,
                    "filetype" => $attachment->filetype,
                    "caption" => $attachment->caption,
                    "caption_en" => $attachment->caption_en
                ];
            }
        }


        $result['laporan'] = null;
        $report = DiskusiLapor::findFirst([
            "id_diskusi=:id_diskusi: AND id_komentar IS NULL AND status != :status_ditolak: AND id_user_terlapor is NULL",
            'bind' => [
                'id_diskusi' => $this->id,
                'status_ditolak' => DiskusiLapor::STATUS_DITOLAK
            ]
        ]);
        if (!empty($report)) {
            $result['laporan'] = $report->toArray();
        }
        if (!empty($report) && $report->status === DiskusiLapor::STATUS_DISETUJUI) {
            $result['title'] = '-';
            $result['content'] = '-';
            $result['is_anonymous'] = 0;
            $result['is_blocked'] = 1;
        }

        $result['count_like'] = count($this->diskusiLike);
        $result['type'] = $this->type;
        $result["produk"] = $this->kategori->produk->nama;
        $result["produk_id"] = $this->kategori->produk->id_index;

        if ($result['id_objek'] != '0') {
            switch (strtolower($result['produk'])) {
                case 'pendidikan':
                    $sekolah = Sekolah::findFirst([
                        'npsn' => $result['id_objek']
                    ]);
                    if (!empty($sekolah) && !empty($sekolah->Jenjang)) {
                        $result['objek_kategori'] = $sekolah->Jenjang->nama_jenjang;
                    } else {
                        '-';
                    }
                    break;
                case 'desa':
                    $result['objek_kategori'] = 'Desa';
                    break;
                case 'kesehatan':
                    // $result['objek_kategori'] = Puskesmas::count([
                    //     'kode_puskesmas' => $result['id_objek'],
                    //     'nama_puskesmas' => $result['nama_objek']
                    // ]) > 0
                    //     ? 'Puskesmas'
                    //     : 'Rumah Sakit';
                    $rs = RumahSakit::find([
                        "conditions" => "kode_rs = :kode_rs: AND nama = :nama:",
                        "bind" => [
                            'kode_rs' => $result['id_objek'],
                            'nama' => $result['nama_objek']
                        ]
                    ]);
                    if (count($rs) > 0) {
                        $result['objek_kategori'] = 'Rumah Sakit';
                    } else {
                        $result['objek_kategori'] = 'Puskesmas';
                    }
                    break;
                case 'rumah sakit':
                    $result['objek_kategori'] = 'Rumah Sakit';
                    break;
                case 'perizinan':
                    $result['objek_kategori'] = 'Perizinan';
                    break;
                case 'bantuan sosial covid-19':
                    $result['objek_kategori'] = 'Bantuan Sosial Covid-19';
                    break;
                default:
                    $result['objek_kategori'] = null;
                    break;
            }
        }
        return $result;
    }

    public function toJsonForDetailFull($columns = null, $profilePictureBaseUrl, $config, $minio)
    {
        $result = $this->toArray([
            'id',
            'title',
            'created_at',
            'updated_at',
            'release_date',
            'content',
            'link_terkait',
            'is_anonymous',
            'is_deleted',
            'views'
        ]);

        if ($result['is_anonymous'] === 1) {
            $result['nama'] = 'Anonim';
            $result["profile_picture_url"] = null;
        } else {
            if (!empty($this->umUser)) {
                $result['nama'] = $this->umUser->um_user_name;
                $result["profile_picture_url"] = MediaHelper::getPresignedUrlFoto($this->umUser->toArray(), UmUser::class, $config, $minio);
            } else {
                $result['nama'] = '-';
                $result["profile_picture_url"] = null;
            }
        }

        // $result['nama'] = empty($this->umUser) ? '-' : $this->umUser->um_user_name;
        // $result["profile_picture_url"] = MediaHelper::getPresignedUrlFoto($this->umUser->toArray(), UmUser::class, $config, $minio);

        $result['uuid_user'] = empty($this->umUser) || $result['is_anonymous'] === 1 ? '' : $this->umUser->uuid_user;
        $result['jenis_kelamin'] = $this->umUser->jenis_kelamin;
        $result['um_id'] = empty($this->umUser) || $result['is_anonymous'] === 1 ? null : $this->umUser->um_id;
        $result['checkmark_verified'] = empty($this->umUser) || $result['is_anonymous'] === 1 ? null : $this->umUser->checkmark_verified;
        $result['is_banned'] = $this->umUser->is_banned;
        // if (!empty($this->diskusiLapor->id_user_terlapor)) {
        //     $result['laporan_user'] = $this->diskusiLapor->toArray();
        // }
        $result['laporan_user'] = DiskusiLapor::findFirst([
            "id_user_terlapor = :id_terlapor: AND status=:status: AND id_user_terlapor is NOT NULL AND deleted_at IS NULL",
            "bind" => [
                'id_terlapor' => $this->umUser->um_id,
                'status' => DiskusiLapor::STATUS_DISETUJUI
            ]
        ]);

        if ((!empty($result['laporan_user']) && $result['laporan_user']->status === DiskusiLapor::STATUS_DISETUJUI) || $result['is_banned']) {
            $result['title'] = '-';
            $result['content'] = '-';
            $result['is_anonymous'] = 0;
            $result['is_blocked'] = 1;
        }

        $result['nama_objek'] = count($this->diskusiObjek) < 1 ? '-' : $this->diskusiObjek[0]->nama_objek;
        $result['id_objek'] = count($this->diskusiObjek) < 1 ? '0' : $this->diskusiObjek[0]->objek_id;
        $result['objek_type'] = count($this->diskusiObjek) < 1 ? '0' : $this->diskusiObjek[0]->objek_type;
        $result['id_topik'] = $this->diskusiBansos == null ? '0' : ($this->diskusiBansos->id_topik == null ? '0' : $this->diskusiBansos->id_topik);
        $result['id_diskusi_bansos'] = empty($this->diskusiBansos) ? null : $this->diskusiBansos->id;
        $result['id_instansi_diskusi_bansos'] = empty($this->diskusiBansos) ? null : $this->diskusiBansos->id_instansi;
        $result['nama_topik'] = $result['id_topik'] == '0' ? '-' : $this->diskusiBansos->topikDiskusiBansos->deskripsi;

        $result['mentions'] = [];
        $uniqueUsersId = [];
        foreach ($this->diskusiMentionUser as $key => $mention) {
            if (!empty($mention->umUser) && !in_array($mention->umUser->um_id, $uniqueUsersId)) {
                $result['mentions'][] = [
                    'nama' => $mention->umUser->um_user_name,
                    'uuid_user' => $mention->umUser->uuid_user,
                    "profile_picture_url" => MediaHelper::getPresignedUrlFoto($mention->umUser->toArray(), UmUser::class, $config, $minio)
                ];
                $uniqueUsersId[] = $mention->umUser->um_id;
            }
        }

        if (!empty($this->diskusiBansos) && $this->diskusiBansos->source == DiskusiBansos::SOURCE_SIPEMANDU) {
            /** @var KeluhanDesaSipemandu $keluhanDesaSipemandu */
            $keluhanDesaSipemandu = KeluhanDesaSipemandu::findByIdDiskusiBansos($this->diskusiBansos->id);
            if ($keluhanDesaSipemandu) {
                foreach ($keluhanDesaSipemandu->Attachments as $attachment) {
                    $result['attachments'][] = [
                        'url' => $attachment->url,
                        "filename" => $attachment->filename,
                        "filetype" => $attachment->type
                    ];
                }
            }
        } else {
            foreach ($this->diskusiAttachment as $key => $attachment) {
                $result['attachments'][] = [
                    'uuid' => $attachment->uuid,
                    "filename" => $attachment->filename,
                    "filetype" => $attachment->filetype,
                    "caption" => $attachment->caption
                ];
            }
        }


        $result['laporan'] = null;
        $report = DiskusiLapor::findFirst([
            "id_diskusi=:id_diskusi: AND id_komentar IS NULL AND status != :status_ditolak: AND id_user_terlapor is NULL",
            'bind' => [
                'id_diskusi' => $this->id,
                'status_ditolak' => DiskusiLapor::STATUS_DITOLAK
            ]
        ]);
        if (!empty($report)) {
            $result['laporan'] = $report->toArray();
        }
        if (!empty($report) && $report->status === DiskusiLapor::STATUS_DISETUJUI) {
            $result['title'] = '-';
            $result['content'] = '-';
            $result['is_anonymous'] = 0;
            $result['is_blocked'] = 1;
        }

        $result['count_like'] = count($this->diskusiLike);
        $result['type'] = $this->type;
        $result["produk"] = $this->kategori->produk->nama;
        $result["produk_id"] = $this->kategori->produk->id_index;

        if ($result['id_objek'] != '0') {
            switch (strtolower($result['produk'])) {
                case 'pendidikan':
                    $sekolah = Sekolah::findFirst([
                        'npsn' => $result['id_objek']
                    ]);
                    if (!empty($sekolah) && !empty($sekolah->Jenjang)) {
                        $result['objek_kategori'] = $sekolah->Jenjang->nama_jenjang;
                    } else {
                        '-';
                    }
                    break;
                case 'desa':
                    $result['objek_kategori'] = 'Desa';
                    break;
                case 'kesehatan':
                    // $result['objek_kategori'] = Puskesmas::count([
                    //     'kode_puskesmas' => $result['id_objek'],
                    //     'nama_puskesmas' => $result['nama_objek']
                    // ]) > 0
                    //     ? 'Puskesmas'
                    //     : 'Rumah Sakit';
                    $rs = RumahSakit::find([
                        "conditions" => "kode_rs = :kode_rs: AND nama = :nama:",
                        "bind" => [
                            'kode_rs' => $result['id_objek'],
                            'nama' => $result['nama_objek']
                        ]
                    ]);
                    if (count($rs) > 0) {
                        $result['objek_kategori'] = 'Rumah Sakit';
                    } else {
                        $result['objek_kategori'] = 'Puskesmas';
                    }
                    break;
                case 'rumah sakit':
                    $result['objek_kategori'] = 'Rumah Sakit';
                    break;
                case 'perizinan':
                    $result['objek_kategori'] = 'Perizinan';
                    break;
                case 'bantuan sosial covid-19':
                    $result['objek_kategori'] = 'Bantuan Sosial Covid-19';
                    break;
                default:
                    $result['objek_kategori'] = null;
                    break;
            }
        }
        return $result;
    }

    public function report()
    {
        return self::getReport($this->id);
    }


    public function isDeleted()
    {
        return $this->is_deleted > 0;
    }

    public static function getReport($id)
    {
        return DiskusiLapor::findFirst([
            "id_diskusi=:id_diskusi: AND id_komentar IS NULL AND status = :status: AND id_user_terlapor is NULL",
            'bind' => [
                'id_diskusi' => $id,
                'status' => DiskusiLapor::STATUS_DISETUJUI
            ]
        ]);
    }

    public static function getCreationReportBetween($start, $end, $type = self::TYPE_DISKUSI)
    {
        $bind = [
            'start' => $start . ' 00:00:00',
            'end' => $end . ' 23:59:59'
        ];
        switch ($type) {
            case self::TYPE_DISKUSI:
                $sql = "SELECT d.created_at::date, count(d.*) from jaga.diskusi d left join jaga.diskusi_bansos b on b.id_diskusi = d.id AND b.deleted_at IS NULL where d.is_deleted = 0 AND d.created_at >= :start AND d.created_at <= :end AND d.type = :type AND b.id IS NULL group by 1 order by 1 asc";
                $bind["type"] = $type;
                break;
            case self::TYPE_BERITA:
                $sql = "SELECT created_at::date, count(*) from jaga.diskusi where is_deleted = 0 AND created_at >= :start AND created_at <= :end AND type = :type group by 1 order by 1 asc";
                $bind["type"] = $type;
                break;
            case self::TYPE_KELUHAN:
                $sql = "SELECT d.created_at::date, count(d.*) from jaga.diskusi d left join jaga.diskusi_bansos b on b.id_diskusi = d.id AND b.deleted_at IS NULL where d.is_deleted = 0 AND d.created_at >= :start AND d.created_at <= :end AND d.type = :type AND b.id IS NOT NULL group by 1 order by 1 asc";
                $bind["type"] = self::TYPE_DISKUSI;
                break;
            default:
                $sql = "SELECT created_at::date, count(*) from jaga.diskusi where is_deleted = 0 AND created_at >= :start AND created_at <= :end group by 1 order by 1 asc";
                break;
        }

        $record = new Diskusi();

        return $record->getReadConnection()->query($sql, $bind)->fetchAll(\PDO::FETCH_ASSOC);
    }

    public static function validateJudulBerita($judul) {
        $slug = CommonTools::slug($judul);
        $keyword = self::slugToQuery($slug);
        $result = Diskusi::find(["conditions" => "title ilike :keyword: and type = 1 and is_deleted = 0", "bind" => ["keyword" => $keyword]]);
        if (count($result) > 0) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Sudah ada berita dengan judul yang mirip dengan judul berita ini! [".$result[0]->title."]");
        } else {
            $result = Diskusi::find(["columns" => "title", "conditions" => "type = 1 and is_deleted = 0"]);
            foreach ($result as $row) {
                $eJudul = CommonTools::slug($row->title);
                if (str_contains($slug, $eJudul)) {
                    throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Sudah ada berita dengan judul yang mirip dengan judul berita ini! [".$row->title."]");
                }
            }
        }
    }

    public static function slugToQuery($slug) {
        return '%'.implode("%", explode("-", strtolower(trim($slug)))).'%';
    }
}
