<?php

namespace App\Models;

use CodeIgniter\Model;

class ModelKunjungan extends Model
{
    protected $table            = 'kunjungan';
    protected $primaryKey       = 'id_kunjungan';
    protected $allowedFields    = [
        'id_pasien',
        'id_dokter',
        'keluhan',
        'diagnosa',
        'tanggal_kunjungan'
    ];

    /**
     * Mengambil semua data kunjungan, diurutkan dari terbaru
     *
     * @return array
     */
    public function getAllData()
    {
        return $this->select('kunjungan.*, pasien.nama_lengkap as nama_pasien, dokter.nama_dokter')
            ->join('pasien', 'pasien.id_pasien = kunjungan.id_pasien')
            ->join('dokter', 'dokter.id_dokter = kunjungan.id_dokter')
            ->orderBy('kunjungan.tanggal_kunjungan', 'DESC')
            ->findAll();
    }

    public function getWithPasien()
    {
        return $this->db->table('kunjungan')
            ->select('kunjungan.id_kunjungan, kunjungan.tanggal_kunjungan, pasien.nama_lengkap')
            ->join('pasien', 'pasien.id_pasien = kunjungan.id_pasien')
            ->orderBy('kunjungan.tanggal_kunjungan', 'DESC')
            ->get()->getResultArray();
    }


    /**
     * Mengambil data kunjungan berdasarkan ID
     *
     * @param int $id_kunjungan
     * @return array|null
     */
    public function getDataById($id_kunjungan)
    {
        return $this->where('id_kunjungan', $id_kunjungan)->first();
    }

    /**
     * Menambahkan data kunjungan
     *
     * @param array $data
     * @return bool
     */
    public function tambahData($data)
    {
        return $this->insert($data);
    }

    /**
     * Memperbarui data kunjungan berdasarkan ID
     *
     * @param int $id_kunjungan
     * @param array $data
     * @return bool
     */
    public function updateData($id_kunjungan, $data)
    {
        return $this->update($id_kunjungan, $data);
    }

    /**
     * Menghapus data kunjungan berdasarkan ID
     *
     * @param int $id_kunjungan
     * @return bool
     */
    public function deleteData($id_kunjungan)
    {
        return $this->delete($id_kunjungan);
    }

    public function getKunjunganYangMemilikiTindakanAtauResep()
    {
        return $this->db->table('kunjungan')
            ->select('kunjungan.id_kunjungan, pasien.nama_lengkap, kunjungan.tanggal_kunjungan')
            ->join('pasien', 'pasien.id_pasien = kunjungan.id_pasien')
            ->groupStart()
            ->whereIn('kunjungan.id_kunjungan', function ($builder) {
                return $builder->select('id_kunjungan')->from('tindakan');
            })
            ->orWhereIn('kunjungan.id_kunjungan', function ($builder) {
                return $builder->select('rekam_medis.id_kunjungan')
                    ->from('resep_obat')
                    ->join('rekam_medis', 'rekam_medis.id_rekam_medis = resep_obat.id_rekam_medis');
            })
            ->groupEnd()
            ->orderBy('kunjungan.tanggal_kunjungan', 'DESC')
            ->get()->getResultArray();
    }
}
