<?php

namespace Jaga\Models\PAK;

use Jaga\Models\BaseModel;
use UmUser;

class PAKDiskusi extends BaseModel {
    public $id;
    public $ref_table;
    public $ref_id;
    public $content;
    public $created_by;
    public $updated_by;
    public $deleted_by;
    public $created_at;
    public $updated_at;
    public $deleted_at;

    const REF_TABLE_IMPLEMENTASI = 'pak_implementasi';
    const REF_TABLE_ISIAN = 'pak_isian_sekolah';

    public function initialize()
    {
        $this->setSchema("jaga");
        $this->setSource("pak_diskusi");
    }

    public static function post(
        $ref_table,
        $ref_id,
        $content,
        $created_by
    ) {
        $pakDiskusi = new PAKDiskusi();
        $pakDiskusi->ref_table = $ref_table;
        $pakDiskusi->ref_id = $ref_id;
        $pakDiskusi->content = $content;
        $pakDiskusi->created_by = $created_by;
        return $pakDiskusi->save();
    }

    /**
     * @param $refTable
     * @param $refId
     * @return PAKImplementasi|PAKIsianSekolah|null
     * @throws \CustomErrorException
     */
    public static function findPakByRef($refTable, $refId) {
        $result = null;
        if ($refTable == self::REF_TABLE_IMPLEMENTASI) {
            $result = self::findPakImplementasi($refId);
        } elseif ($refTable == self::REF_TABLE_ISIAN) {
            $result = self::findPakIsian($refId);
        } else {
            throw new \CustomErrorException(\BaseResponse::INVALID_REQUEST, "Nama referensi tidak valid");
        }

        return $result;
    }

    public static function findWithDetail($refTable, $refId, $limit, $offset) {
        $columns = [
            PAKDiskusi::class.".id",
            PAKDiskusi::class.".ref_table",
            PAKDiskusi::class.".ref_id",
            PAKDiskusi::class.".content",
            PAKDiskusi::class.".created_by",
            PAKDiskusi::class.".created_at",
            UmUser::class.".um_user_name",
            UmUser::class.".nama",
        ];
        return PAKDiskusi::query()
            ->columns(join(",", $columns))
            ->where(PAKDiskusi::class.".ref_table = :ref_table: AND ".PAKDiskusi::class.".ref_id = :ref_id:")
            ->leftJoin(UmUser::class, UmUser::class.".um_id = ".PAKDiskusi::class.".created_by")
            ->limit($limit, $offset)
            ->bind(['ref_table' => $refTable, 'ref_id' => $refId])
            ->execute();
    }

    private static function findPakImplementasi($refId): PAKImplementasi
    {
        return PAKImplementasi::findOrFail($refId);
    }

    private static function findPakIsian($refId): PAKIsianSekolah {
        return PAKIsianSekolah::findOrFail($refId);
    }
}
