<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;

class Audit extends Model
{
    use HasFactory;

    protected $table = 'audit';

    protected $fillable = [
        'user_id',
        'auditor',
        'auditi',
        'tema_id',
        'kategori',
        'bagian_id',
        'lokasi',
        'foto_sebelum',
        'keterangan',
        'pic_perbaikan',
        'keterangan_sesudah',
        'foto_sesudah',
        'status',
        'tanggal_audit',
        'tanggal_verifikasi',
        'periode_id',
    ];

    // ✅ Casting supaya field tanggal otomatis jadi Carbon instance
    protected $casts = [
        'tanggal_audit'     => 'datetime',
        'tanggal_verifikasi'=> 'datetime',
        'created_at'        => 'datetime',
        'updated_at'        => 'datetime',
    ];

    // ===== RELASI =====
    public function bagian()
    {
        return $this->belongsTo(Bagian::class, 'bagian_id');
    }

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

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

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

    public function tema()
    {
        return $this->belongsTo(Tema::class, 'tema_id');
    }

    public function periode()
    {
        return $this->belongsTo(Periode::class, 'periode_id');
    }

    // ===== AUTO SET periode_id SAAT CREATE =====
    protected static function booted()
    {
        static::creating(function (Audit $audit) {
            if (empty($audit->tema_id) || empty($audit->tanggal_audit)) {
                return;
            }

            try {
                $tanggal = Carbon::parse($audit->tanggal_audit)->toDateString();
            } catch (\Throwable $e) {
                return; // skip kalau tanggal tidak valid
            }

            // cari periode yang sesuai
            $periodeId = Periode::forTemaAndDate($audit->tema_id, $tanggal)->value('id');

            // fallback: pakai periode "open" terbaru untuk tema tsb
            if (!$periodeId) {
                $periodeId = Periode::where('tema_id', $audit->tema_id)
                    ->whereNull('tanggal_selesai')
                    ->orderByDesc('tanggal_mulai')
                    ->value('id');
            }

            if ($periodeId) {
                $audit->periode_id = $periodeId;
            }
        });
    }
}
