<?php

namespace App\Observers;

use App\Models\DnsRecord;
use App\Services\PowerDNSService;
use Illuminate\Support\Facades\Log;

class DnsRecordObserver
{
    protected $powerDNS;

    public function __construct(PowerDNSService $powerDNS)
    {
        $this->powerDNS = $powerDNS;
    }

    /**
     * Handle the DnsRecord "created" event.
     */
    public function created(DnsRecord $dnsRecord): void
    {
        $dnsZone = $dnsRecord->dnsZone;
        
        if (!$dnsZone || !$dnsZone->sync_to_powerdns || !$dnsZone->powerdns_zone_id) {
            return;
        }

        try {
            // Construiește numele complet
            $fullName = $dnsRecord->name . '.' . rtrim($dnsZone->domain, '.') . '.';
            
            // Adaugă înregistrarea în PowerDNS
            $result = $this->powerDNS->addRecord(
                $dnsZone->powerdns_zone_id,
                $fullName,
                $dnsRecord->type,
                $dnsRecord->content,
                $dnsRecord->ttl ?? 3600
            );
            
            if ($result) {
                Log::info("Înregistrare DNS {$fullName} sincronizată cu PowerDNS");
            }
        } catch (\Exception $e) {
            Log::error("Eroare sincronizare înregistrare DNS cu PowerDNS: " . $e->getMessage());
        }
    }

    /**
     * Handle the DnsRecord "updated" event.
     */
    public function updated(DnsRecord $dnsRecord): void
    {
        $dnsZone = $dnsRecord->dnsZone;
        
        if (!$dnsZone || !$dnsZone->sync_to_powerdns || !$dnsZone->powerdns_zone_id) {
            return;
        }

        try {
            // Construiește numele complet
            $fullName = $dnsRecord->name . '.' . rtrim($dnsZone->domain, '.') . '.';
            
            // Șterge înregistrarea veche
            $this->powerDNS->deleteRecord(
                $dnsZone->powerdns_zone_id,
                $fullName,
                $dnsRecord->type
            );
            
            // Adaugă înregistrarea nouă
            $this->powerDNS->addRecord(
                $dnsZone->powerdns_zone_id,
                $fullName,
                $dnsRecord->type,
                $dnsRecord->content,
                $dnsRecord->ttl ?? 3600
            );
            
            Log::info("Înregistrare DNS {$fullName} actualizată în PowerDNS");
        } catch (\Exception $e) {
            Log::error("Eroare actualizare înregistrare DNS în PowerDNS: " . $e->getMessage());
        }
    }

    /**
     * Handle the DnsRecord "deleted" event.
     */
    public function deleted(DnsRecord $dnsRecord): void
    {
        $dnsZone = $dnsRecord->dnsZone;
        
        if (!$dnsZone || !$dnsZone->sync_to_powerdns || !$dnsZone->powerdns_zone_id) {
            return;
        }

        try {
            // Construiește numele complet
            $fullName = $dnsRecord->name . '.' . rtrim($dnsZone->domain, '.') . '.';
            
            // Șterge înregistrarea din PowerDNS
            $this->powerDNS->deleteRecord(
                $dnsZone->powerdns_zone_id,
                $fullName,
                $dnsRecord->type
            );
            
            Log::info("Înregistrare DNS {$fullName} ștearsă din PowerDNS");
        } catch (\Exception $e) {
            Log::error("Eroare ștergere înregistrare DNS din PowerDNS: " . $e->getMessage());
        }
    }

    /**
     * Handle the DnsRecord "restored" event.
     */
    public function restored(DnsRecord $dnsRecord): void
    {
        $this->created($dnsRecord);
    }

    /**
     * Handle the DnsRecord "force deleted" event.
     */
    public function forceDeleted(DnsRecord $dnsRecord): void
    {
        $this->deleted($dnsRecord);
    }
}
