<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Mahasiswa extends Model
{
    protected $table = 'mahasiswa';

    protected $fillable = [
        'kampus_id',
        'prodi_id',
        'rap_id',
        'nama',
        'nim',
        'nik',
        'angkatan',
        'tahun_ajaran',
        'tempat_lahir',
        'tanggal_lahir',
        'agama',
        'jenis_kelamin',
        'no_wa',
        'no_darurat',
        'email',
        'alamat',
        'nama_ayah',
        'nama_ibu',
        'kelompok',
        'status_masuk',
        'waktu_kuliah',
        'ukuran_jaket',
        'sumber_informasi',
        'validasi_status',
        'validasi_at',
        'validasi_by',
        'status_akademik',
        'cuti_semester',
        'pengajuan_status',
        'pengajuan_jenis',
        'pengajuan_file',
        'bukti_bayar_file',
        'pengajuan_at',
        'pengajuan_by',
        'pengajuan_validasi_at',
        'pengajuan_validasi_by',
    ];

    protected $casts = [
        'tanggal_lahir' => 'date',
        'validasi_at' => 'datetime',
        'pengajuan_at' => 'datetime',
        'pengajuan_validasi_at' => 'datetime',
        'cuti_semester' => 'array',
    ];

    // Relasi
    public function kampus()
    {
        return $this->belongsTo(Kampus::class);
    }

    public function prodi()
    {
        return $this->belongsTo(Prodi::class);
    }

    public function rap()
    {
        return $this->belongsTo(Rap::class, 'rap_id');
    }

    public function angsuran()
    {
        return $this->hasOne(Angsuran::class);
    }

    public function validator()
    {
        return $this->belongsTo(User::class, 'validasi_by');
    }

    public function pengaju()
    {
        return $this->belongsTo(User::class, 'pengajuan_by');
    }

    public function validatorPengajuan()
    {
        return $this->belongsTo(User::class, 'pengajuan_validasi_by');
    }

    // Helper untuk menambahkan semester cuti
    public function addCutiSemester($semester)
    {
        $cutiSemester = $this->cuti_semester ?? [];
        $semester = (int) $semester;

        if (!in_array($semester, $cutiSemester)) {
            $cutiSemester[] = $semester;
            sort($cutiSemester);
            $this->cuti_semester = $cutiSemester;
        }

        return $this;
    }

    // Helper untuk mendapatkan history cuti dalam bentuk teks
    public function getCutiHistoryTextAttribute()
    {
        $cutiSemester = $this->cuti_semester ?? [];
        if (empty($cutiSemester)) {
            return '-';
        }
        return 'Semester ' . implode(', ', $cutiSemester);
    }

    // Accessor untuk text status akademik
    public function getStatusAkademikTextAttribute()
    {
        return match ($this->status_akademik) {
            'aktif' => 'Aktif',
            'cuti' => 'Cuti',
            'drop_out' => 'Drop Out',
            'lulus' => 'Lulus',
            'tidak_aktif' => 'Tidak Aktif',
            default => $this->status_akademik ?? '-',
        };
    }

    // Accessor untuk text status pengajuan
    public function getPengajuanStatusTextAttribute()
    {
        return match ($this->pengajuan_status) {
            'tidak_ada' => 'Tidak Ada',
            'pending' => 'Pending',
            'disetujui' => 'Disetujui',
            'ditolak' => 'Ditolak',
            default => $this->pengajuan_status ?? '-',
        };
    }

    // Accessor untuk text jenis pengajuan
    public function getPengajuanJenisTextAttribute()
    {
        if (!$this->pengajuan_jenis)
            return '-';

        return match ($this->pengajuan_jenis) {
            'aktif' => 'Aktif',
            'cuti' => 'Cuti',
            'drop_out' => 'Drop Out',
            'lulus' => 'Lulus',
            'tidak_aktif' => 'Tidak Aktif',
            default => $this->pengajuan_jenis,
        };
    }
}
