<?php

namespace App\Models;

use CodeIgniter\Model;

class ModelRekapPenghargaan extends Model
{
    protected $table            = 'tb_rekap_penghargaan';
    protected $primaryKey       = 'id_rekap_penghargaan';
    protected $returnType       = 'array';
    protected $useAutoIncrement = true;

    protected $allowedFields = [
        'id_siswa',
        'id_penghargaan',
        'id_guru',
        'tanggal',
        'keterangan_tambahan'
    ];

    protected $useTimestamps = false;

    /**
     * Menampilkan seluruh rekap penghargaan
     */
    public function getRekap()
    {
        return $this->select('
                tb_rekap_penghargaan.*,
                tb_siswa.nis,
                tb_siswa.nama,
                tb_kelas.nama_kelas,
                tb_penghargaan.nama_penghargaan,
                tb_penghargaan.poin,
                tb_guru.nama AS nama_guru
            ')
            ->join('tb_siswa', 'tb_siswa.id_siswa = tb_rekap_penghargaan.id_siswa')
            ->join('tb_kelas', 'tb_kelas.id_kelas = tb_siswa.id_kelas')
            ->join('tb_penghargaan', 'tb_penghargaan.id_penghargaan = tb_rekap_penghargaan.id_penghargaan')
            ->join('tb_guru', 'tb_guru.id_guru = tb_rekap_penghargaan.id_guru')
            ->orderBy('tanggal', 'DESC')
            ->findAll();
    }

    /**
     * Rekap penghargaan berdasarkan murid
     */
    public function getBySiswa($id_siswa)
    {
        return $this->select('
                tb_rekap_penghargaan.*,
                tb_penghargaan.nama_penghargaan,
                tb_penghargaan.poin,
                tb_guru.nama AS nama_guru
            ')
            ->join('tb_penghargaan', 'tb_penghargaan.id_penghargaan = tb_rekap_penghargaan.id_penghargaan')
            ->join('tb_guru', 'tb_guru.id_guru = tb_rekap_penghargaan.id_guru')
            ->where('tb_rekap_penghargaan.id_siswa', $id_siswa)
            ->orderBy('tanggal', 'DESC')
            ->findAll();
    }

    /**
     * Total penghargaan hari ini
     */
    public function totalHariIni()
    {
        return $this->where('DATE(tanggal)', date('Y-m-d'))->countAllResults();
    }

    /**
     * Total seluruh penghargaan yang diberikan
     */
    public function totalPenghargaan()
    {
        return $this->countAll();
    }

    public function getPenghargaanPerKelas($id_kelas)
    {
        return $this->select('
            tb_rekap_penghargaan.*,
            tb_siswa.nama AS nama_siswa,
            tb_penghargaan.nama_penghargaan,
            tb_penghargaan.poin,
            tb_guru.nama AS nama_guru
        ')
            ->join('tb_siswa', 'tb_siswa.id_siswa=tb_rekap_penghargaan.id_siswa')
            ->join('tb_penghargaan', 'tb_penghargaan.id_penghargaan=tb_rekap_penghargaan.id_penghargaan')
            ->join('tb_guru', 'tb_guru.id_guru=tb_rekap_penghargaan.id_guru', 'left')
            ->where('tb_siswa.id_kelas', $id_kelas)
            ->orderBy('tanggal', 'DESC')
            ->findAll();
    }

    public function totalPoinMurid($id_siswa)
    {
        $row = $this->select('SUM(tb_penghargaan.poin) AS total')
            ->join(
                'tb_penghargaan',
                'tb_penghargaan.id_penghargaan = tb_rekap_penghargaan.id_penghargaan'
            )
            ->where('tb_rekap_penghargaan.id_siswa', $id_siswa)
            ->first();

        return $row['total'] ?? 0;
    }

    public function totalPoinKelas($id_kelas)
    {
        $row = $this->select('SUM(tb_penghargaan.poin) AS total')
            ->join(
                'tb_siswa',
                'tb_siswa.id_siswa = tb_rekap_penghargaan.id_siswa'
            )
            ->join(
                'tb_penghargaan',
                'tb_penghargaan.id_penghargaan = tb_rekap_penghargaan.id_penghargaan'
            )
            ->where('tb_siswa.id_kelas', $id_kelas)
            ->first();

        return $row['total'] ?? 0;
    }

    public function getPenghargaanKelas($id_kelas)
    {
        return $this->select('
        tb_rekap_penghargaan.*,

        tb_siswa.nama AS nama_siswa,

        tb_penghargaan.nama_penghargaan,
        tb_penghargaan.poin,

        tb_guru.nama AS nama_guru
    ')
            ->join(
                'tb_siswa',
                'tb_siswa.id_siswa = tb_rekap_penghargaan.id_siswa'
            )
            ->join(
                'tb_penghargaan',
                'tb_penghargaan.id_penghargaan = tb_rekap_penghargaan.id_penghargaan'
            )
            ->join(
                'tb_guru',
                'tb_guru.id_guru = tb_rekap_penghargaan.id_guru',
                'left'
            )
            ->where('tb_siswa.id_kelas', $id_kelas)
            ->orderBy('tb_rekap_penghargaan.tanggal', 'DESC')
            ->findAll();
    }

    public function getByKelas($id_kelas)
    {
        return $this->select('
        tb_rekap_penghargaan.*,

        tb_siswa.nis,
        tb_siswa.nama,

        tb_penghargaan.nama_penghargaan,
        tb_penghargaan.poin,

        tb_guru.nama AS nama_guru
    ')
            ->join(
                'tb_siswa',
                'tb_siswa.id_siswa = tb_rekap_penghargaan.id_siswa'
            )
            ->join(
                'tb_penghargaan',
                'tb_penghargaan.id_penghargaan = tb_rekap_penghargaan.id_penghargaan'
            )
            ->join(
                'tb_guru',
                'tb_guru.id_guru = tb_rekap_penghargaan.id_guru'
            )
            ->where('tb_siswa.id_kelas', $id_kelas)
            ->orderBy('tb_rekap_penghargaan.tanggal', 'DESC')
            ->findAll();
    }
}
