<?php

namespace App\Http\Controllers\Agency;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Str;

class AgencyWebsiteController extends Controller
{
    /**
     * Show website settings page
     */
    public function index()
    {
        $agency = auth()->user()->agency;

        if (!$agency) {
            abort(403, 'You must belong to an agency');
        }

        return view('agency.page.settings', compact('agency'));
    }

    /**
     * Update subdomain
     */
    public function updateSubdomain(Request $request)
    {
        $request->validate([
            'subdomain' => [
                'required',
                'string',
                'max:63',
                'regex:/^[a-z0-9][a-z0-9-]*[a-z0-9]$/',
                'unique:agencies,subdomain,' . auth()->user()->agency->id,
            ],
        ], [
            'subdomain.regex' => 'Subdomain sadece küçük harf, rakam ve tire içerebilir.',
            'subdomain.unique' => 'Bu subdomain zaten kullanılıyor.',
        ]);

        $agency = auth()->user()->agency;

        // Subdomain'i küçük harfe çevir ve temizle
        $subdomain = strtolower(trim($request->subdomain));

        // Yasaklı subdomain'leri kontrol et
        $reserved = ['www', 'admin', 'api', 'mail', 'ftp', 'blog', 'shop', 'store', 'app', 'dev', 'test', 'staging'];
        if (in_array($subdomain, $reserved)) {
            return response()->json([
                'success' => false,
                'message' => 'Bu subdomain adı rezerve edilmiştir. Lütfen başka bir isim seçin.',
            ], 422);
        }

        $agency->update([
            'subdomain' => $subdomain,
        ]);

        return response()->json([
            'success' => true,
            'message' => 'Subdomain güncellendi',
            'subdomain_url' => $agency->subdomain_url,
        ]);
    }

    /**
     * Update custom domain
     */
    public function updateCustomDomain(Request $request)
    {
        $request->validate([
            'custom_domain' => [
                'required',
                'string',
                'max:255',
                'regex:/^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/',
                'unique:agencies,custom_domain,' . auth()->user()->agency->id,
            ],
        ], [
            'custom_domain.regex' => 'Geçerli bir domain adresi girin (örn: example.com).',
            'custom_domain.unique' => 'Bu domain zaten kullanılıyor.',
        ]);

        $agency = auth()->user()->agency;

        // Domain'i küçük harfe çevir ve temizle
        $domain = strtolower(trim($request->custom_domain));

        // www prefix'ini kaldır
        $domain = preg_replace('/^www\./', '', $domain);

        $agency->update([
            'custom_domain' => $domain,
            'custom_domain_verified' => false, // Yeni domain eklendi, doğrulama gerekli
            'custom_domain_verified_at' => null,
            'use_custom_domain' => false, // Doğrulanana kadar kullanılmasın
        ]);

        return response()->json([
            'success' => true,
            'message' => 'Özel domain eklendi. Lütfen DNS ayarlarını yapıp doğrulama işlemini tamamlayın.',
            'agency' => $agency->fresh(),
        ]);
    }

    /**
     * Verify custom domain
     */
    public function verifyCustomDomain(Request $request)
    {
        $agency = auth()->user()->agency;

        if (!$agency->custom_domain) {
            return response()->json([
                'success' => false,
                'message' => 'Önce bir özel domain eklemelisiniz.',
            ], 422);
        }

        // DNS kayıtlarını kontrol et
        // Gerçek implementasyonda DNS TXT kaydı veya CNAME kontrolü yapılmalı
        // Şimdilik simüle ediyoruz

        $verified = $this->checkDnsRecords($agency->custom_domain);

        if ($verified) {
            $agency->update([
                'custom_domain_verified' => true,
                'custom_domain_verified_at' => now(),
            ]);

            return response()->json([
                'success' => true,
                'message' => 'Domain doğrulandı! Artık özel domaininizi kullanabilirsiniz.',
                'agency' => $agency->fresh(),
            ]);
        }

        return response()->json([
            'success' => false,
            'message' => 'DNS kayıtları doğrulanamadı. Lütfen ayarlarınızı kontrol edin ve tekrar deneyin.',
        ], 422);
    }

    /**
     * Toggle use custom domain
     */
    public function toggleCustomDomain(Request $request)
    {
        $agency = auth()->user()->agency;

        if (!$agency->custom_domain_verified) {
            return response()->json([
                'success' => false,
                'message' => 'Önce domaininizi doğrulamalısınız.',
            ], 422);
        }

        $useCustomDomain = !$agency->use_custom_domain;

        $agency->update([
            'use_custom_domain' => $useCustomDomain,
        ]);

        $message = $useCustomDomain
            ? 'Özel domain aktif edildi'
            : 'Subdomain kullanımına geri dönüldü';

        return response()->json([
            'success' => true,
            'message' => $message,
            'agency' => $agency->fresh(),
        ]);
    }

    /**
     * Remove custom domain
     */
    public function removeCustomDomain(Request $request)
    {
        $agency = auth()->user()->agency;

        $agency->update([
            'custom_domain' => null,
            'custom_domain_verified' => false,
            'custom_domain_verified_at' => null,
            'use_custom_domain' => false,
            'ssl_status' => null,
            'ssl_issued_at' => null,
        ]);

        return response()->json([
            'success' => true,
            'message' => 'Özel domain kaldırıldı',
            'agency' => $agency->fresh(),
        ]);
    }

    /**
     * Check DNS records (simulated)
     *
     * Gerçek implementasyonda:
     * - DNS TXT kaydı kontrolü (örn: _acente-verify=TOKEN)
     * - CNAME kaydı kontrolü
     * - A kaydı kontrolü
     */
    private function checkDnsRecords(string $domain): bool
    {
        // Geliştirme ortamında her zaman true döndür
        if (app()->environment('local')) {
            return true;
        }

        // Gerçek DNS kontrolü için dns_get_record kullanılabilir
        // $records = dns_get_record($domain, DNS_TXT);
        // foreach ($records as $record) {
        //     if (isset($record['txt']) && str_starts_with($record['txt'], '_acente-verify=')) {
        //         return true;
        //     }
        // }

        return false;
    }
}
