<?php

namespace App\Models;

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

class DnsRecord extends Model
{
    use HasFactory;

    protected $fillable = [
        'dns_zone_id',
        'name',
        'type',
        'content',
        'ttl',
        'priority',
        'is_active',
        'notes',
    ];

    protected function casts(): array
    {
        return [
            'ttl' => 'integer',
            'priority' => 'integer',
            'is_active' => 'boolean',
        ];
    }

    /**
     * Relația cu zona DNS
     */
    public function dnsZone()
    {
        return $this->belongsTo(DnsZone::class);
    }

    /**
     * Relația cu istoricul modificărilor
     */
    public function changes()
    {
        return $this->hasMany(DnsRecordChange::class)->orderBy('created_at', 'desc');
    }

    /**
     * Tipurile de înregistrări DNS permise
     */
    public static function allowedTypes(): array
    {
        return ['A', 'AAAA', 'CNAME', 'MX', 'TXT', 'NS', 'SRV', 'CAA'];
    }

    /**
     * Verifică dacă înregistrarea este activă
     */
    public function isActive(): bool
    {
        return $this->is_active;
    }

    /**
     * Obține numele complet (FQDN)
     */
    public function getFullNameAttribute(): string
    {
        return $this->name . '.' . $this->dnsZone->domain;
    }

    /**
     * Folosește o combinație de nume și tip pentru route key
     */
    public function getRouteKey()
    {
        return $this->name . '-' . $this->type . '-' . $this->id;
    }

    /**
     * Rezolvă model binding folosind nume-tip-id
     */
    public function resolveRouteBinding($value, $field = null)
    {
        // Dacă valoarea este numerică, folosește ID-ul direct (backwards compatibility)
        if (is_numeric($value)) {
            return $this->where('id', $value)->firstOrFail();
        }

        // Altfel, încearcă să parseze formatul nume-tip-id
        $parts = explode('-', $value);
        if (count($parts) >= 3) {
            $id = array_pop($parts);
            return $this->where('id', $id)->firstOrFail();
        }

        return null;
    }
}
