<?php

namespace App\Observers;

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

class DnsZoneObserver
{
    protected $powerDNS;

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

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

        try {
            // Creează zona în PowerDNS
            $zoneName = rtrim($dnsZone->domain, '.') . '.';
            
            $zoneData = [
                'name' => $zoneName,
                'kind' => 'Native',
                'nameservers' => [],
            ];
            
            $result = $this->powerDNS->createZone($zoneData);
            
            if ($result) {
                // Salvează ID-ul zonei PowerDNS
                $dnsZone->powerdns_zone_id = $zoneName;
                $dnsZone->saveQuietly(); // Evită loop infinit
                
                Log::info("Zona DNS {$dnsZone->domain} sincronizată cu PowerDNS");
            }
        } catch (\Exception $e) {
            Log::error("Eroare sincronizare zonă DNS cu PowerDNS: " . $e->getMessage());
        }
    }

    /**
     * Handle the DnsZone "updated" event.
     */
    public function updated(DnsZone $dnsZone): void
    {
        // Dacă s-a activat sincronizarea și zona nu există în PowerDNS
        if ($dnsZone->sync_to_powerdns && !$dnsZone->powerdns_zone_id) {
            $this->created($dnsZone);
        }
        
        // Dacă s-a dezactivat sincronizarea
        if (!$dnsZone->sync_to_powerdns && $dnsZone->powerdns_zone_id) {
            // Opțional: șterge zona din PowerDNS
            // $this->PowerDNS->deletezonă($dnszonă->PowerDNS_zonă_id);
            // $dnszonă->PowerDNS_zonă_id = null;
            // $dnszonă->saveQuietly();
        }
    }

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

        try {
            // Șterge zona din PowerDNS
            $this->powerDNS->deleteZone($dnsZone->powerdns_zone_id);
            Log::info("Zona DNS {$dnsZone->domain} ștearsă din PowerDNS");
        } catch (\Exception $e) {
            Log::error("Eroare ștergere zonă DNS din PowerDNS: " . $e->getMessage());
        }
    }

    /**
     * Handle the DnsZone "restored" event.
     */
    public function restored(DnsZone $dnsZone): void
    {
        //
    }

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