<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\EmailTemplate;
use App\Models\Setting;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class EmailTemplateController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        $templates = EmailTemplate::orderBy('category')->orderBy('name')->get();
        return view('admin.email-templates.index', compact('templates'));
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        return view('admin.email-templates.create');
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        $validated = $request->validate([
            'key' => 'required|string|unique:email_templates,key|max:255',
            'name' => 'required|string|max:255',
            'subject' => 'required|string|max:255',
            'body' => 'required|string',
            'category' => 'required|in:system,notification,alert',
            'description' => 'nullable|string',
            'is_active' => 'boolean'
        ]);

        $validated['is_active'] = $request->has('is_active');

        // Extrage variabilele din body
        preg_match_all('/{([a-zA-Z_]+)}/', $validated['body'], $matches);
        $validated['variables'] = array_unique($matches[1]);

        EmailTemplate::create($validated);

        return redirect()->route('admin.settings.email-templates')
            ->with('success', 'Șablonul email a fost creat cu succes!');
    }

    /**
     * Display the specified resource.
     */
    public function show(string $id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(EmailTemplate $emailTemplate)
    {
        return view('admin.email-templates.edit', compact('emailTemplate'));
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, EmailTemplate $emailTemplate)
    {
        $validated = $request->validate([
            'key' => 'required|string|max:255|unique:email_templates,key,' . $emailTemplate->id,
            'name' => 'required|string|max:255',
            'subject' => 'required|string|max:255',
            'body' => 'required|string',
            'category' => 'required|in:system,notification,alert',
            'description' => 'nullable|string',
            'is_active' => 'boolean'
        ]);

        $validated['is_active'] = $request->has('is_active');

        // Extrage variabilele din body
        preg_match_all('/{([a-zA-Z_]+)}/', $validated['body'], $matches);
        $validated['variables'] = array_unique($matches[1]);

        $emailTemplate->update($validated);

        return redirect()->route('admin.settings.email-templates')
            ->with('success', 'Șablonul email a fost actualizat cu succes!');
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(EmailTemplate $emailTemplate)
    {
        $emailTemplate->delete();

        return redirect()->route('admin.settings.email-templates')
            ->with('success', 'Șablonul email a fost șters cu succes!');
    }

    /**
     * Preview un șablon email cu date simulate
     */
    public function preview(EmailTemplate $emailTemplate)
    {
        // Date simulate pentru preview
        $sampleData = [
            'name' => 'Ion Popescu',
            'email' => 'ion.popescu@example.com',
            'verification_url' => url('/verify/sample-token'),
            'reset_url' => url('/reset-password/sample-token'),
            'app_name' => Setting::get('app_name', config('app.name')),
            'app_url' => Setting::get('app_url', config('app.url')),
            'domain' => 'exemplu.ro',
            'nameservers' => 'ns1.dns-panel.ro, ns2.dns-panel.ro',
            'expiry_date' => now()->addDays(7)->format('d.m.Y'),
        ];

        return response()->json([
            'subject' => $emailTemplate->renderSubject($sampleData),
            'body' => $emailTemplate->render($sampleData)
        ]);
    }

    /**
     * Trimite un email de test
     */
    public function test(Request $request, EmailTemplate $emailTemplate)
    {
        $request->validate([
            'email' => 'required|email'
        ]);

        try {
            // Date simulate pentru test
            $sampleData = [
                'name' => auth()->user()->name,
                'email' => $request->email,
                'verification_url' => url('/verify/test-token'),
                'reset_url' => url('/reset-password/test-token'),
                'app_name' => Setting::get('app_name', config('app.name')),
                'app_url' => Setting::get('app_url', config('app.url')),
                'domain' => 'test-domain.ro',
                'nameservers' => 'ns1.dns-panel.ro, ns2.dns-panel.ro',
                'expiry_date' => now()->addDays(7)->format('d.m.Y'),
            ];

            $subject = $emailTemplate->renderSubject($sampleData);
            $body = $emailTemplate->render($sampleData);

            Mail::html($body, function ($message) use ($request, $subject) {
                $message->to($request->email)
                    ->subject('[TEST] ' . $subject);
            });

            return response()->json([
                'success' => true,
                'message' => 'Email-ul de test a fost trimis cu succes la ' . $request->email
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Eroare la trimiterea emailului: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * Duplică un șablon
     */
    public function duplicate(EmailTemplate $emailTemplate)
    {
        try {
            $newTemplate = $emailTemplate->replicate();
            $newTemplate->key = $emailTemplate->key . '_copy_' . time();
            $newTemplate->name = $emailTemplate->name . ' (Copie)';
            $newTemplate->is_active = false;
            $newTemplate->save();

            return response()->json([
                'success' => true,
                'message' => 'Șablonul a fost duplicat cu succes!'
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Eroare la duplicare: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * Generează șabloanele email default
     */
    public function generateDefaults()
    {
        $defaults = [
            [
                'key' => 'welcome_email',
                'name' => 'Email Bun Venit',
                'category' => 'system',
                'subject' => 'Bine ai venit la {app_name}!',
                'body' => '<h2>Bun venit, {name}!</h2>
<p>Îți mulțumim că te-ai înregistrat la <strong>{app_name}</strong>.</p>
<p>Contul tău a fost creat cu succes și ești gata să începi să gestionezi zonele DNS.</p>
<p><a href="{app_url}" style="background-color: #f97316; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block;">Accesează Panoul de Control</a></p>
<p>Dacă ai întrebări, nu ezita să ne contactezi.</p>
<p>Cu stimă,<br>Echipa {app_name}</p>',
                'description' => 'Trimis utilizatorilor noi după înregistrare',
                'is_active' => true
            ],
            [
                'key' => 'verify_email',
                'name' => 'Verificare Email',
                'category' => 'system',
                'subject' => 'Verifică-ți adresa de email - {app_name}',
                'body' => '<h2>Salut, {name}!</h2>
<p>Te rugăm să îți verifici adresa de email făcând click pe butonul de mai jos:</p>
<p><a href="{verification_url}" style="background-color: #10b981; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block;">Verifică Email</a></p>
<p>Dacă nu ai creat un cont la {app_name}, poți ignora acest email.</p>
<p>Link-ul expiră în 24 de ore.</p>
<p>Cu stimă,<br>Echipa {app_name}</p>',
                'description' => 'Trimis pentru verificarea adresei de email',
                'is_active' => true
            ],
            [
                'key' => 'reset_password',
                'name' => 'Resetare Parolă',
                'category' => 'system',
                'subject' => 'Resetare parolă - {app_name}',
                'body' => '<h2>Salut, {name}!</h2>
<p>Ai solicitat resetarea parolei pentru contul tău.</p>
<p><a href="{reset_url}" style="background-color: #3b82f6; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block;">Resetează Parola</a></p>
<p>Dacă nu ai solicitat această resetare, poți ignora acest email. Parola ta va rămâne neschimbată.</p>
<p>Link-ul expiră în 60 de minute.</p>
<p>Cu stimă,<br>Echipa {app_name}</p>',
                'description' => 'Trimis când utilizatorul solicită resetarea parolei',
                'is_active' => true
            ],
            [
                'key' => 'plan_expiry_reminder',
                'name' => 'Reminder Expirare Plan',
                'category' => 'notification',
                'subject' => '⚠️ Planul tău expiră pe {expiry_date} - {app_name}',
                'body' => '<h2>Salut, {name}!</h2>
<p>Îți aducem aminte că planul tău la <strong>{app_name}</strong> expiră pe <strong>{expiry_date}</strong>.</p>
<p>Pentru a evita întreruperea serviciilor DNS, te rugăm să îți reînnoiești abonamentul.</p>
<p><a href="{app_url}/plans" style="background-color: #f97316; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block;">Reînnoiește Acum</a></p>
<p>Dacă ai întrebări despre planuri sau prețuri, contactează-ne.</p>
<p>Cu stimă,<br>Echipa {app_name}</p>',
                'description' => 'Trimis înainte de expirarea planului',
                'is_active' => true
            ],
            [
                'key' => 'dns_zone_created',
                'name' => 'Zonă DNS Creată',
                'category' => 'notification',
                'subject' => '✅ Zona DNS {domain} a fost creată - {app_name}',
                'body' => '<h2>Salut, {name}!</h2>
<p>Zona DNS pentru domeniul <strong>{domain}</strong> a fost creată cu succes!</p>
<p><strong>Nameserver-e de configurat:</strong></p>
<pre style="background: #f3f4f6; padding: 15px; border-radius: 6px;">{nameservers}</pre>
<p>Configurează aceste nameserver-e la registrar-ul domeniului tău pentru ca modificările să devină active.</p>
<p>Propagarea DNS poate dura până la 48 de ore.</p>
<p><a href="{app_url}/dns-zones" style="background-color: #10b981; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block;">Gestionează Zonele DNS</a></p>
<p>Cu stimă,<br>Echipa {app_name}</p>',
                'description' => 'Trimis când se creează o zonă DNS nouă',
                'is_active' => true
            ],
            [
                'key' => 'dns_alert',
                'name' => 'Alertă DNS',
                'category' => 'alert',
                'subject' => '🚨 Alertă DNS pentru {domain} - {app_name}',
                'body' => '<h2>Atenție, {name}!</h2>
<p>Am detectat o problemă cu zona DNS <strong>{domain}</strong>.</p>
<div style="background: #fef2f2; border-left: 4px solid #ef4444; padding: 15px; margin: 15px 0;">
<p style="color: #991b1b; margin: 0;"><strong>Detalii alertă:</strong></p>
<p style="color: #991b1b; margin: 5px 0 0 0;">Verifică configurația zonei DNS pentru a rezolva problema.</p>
</div>
<p><a href="{app_url}/dns-zones" style="background-color: #ef4444; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block;">Verifică Zona DNS</a></p>
<p>Dacă ai nevoie de ajutor, contactează echipa de suport.</p>
<p>Cu stimă,<br>Echipa {app_name}</p>',
                'description' => 'Trimis când apare o problemă cu zona DNS',
                'is_active' => true
            ]
        ];

        $created = 0;
        $skipped = 0;

        foreach ($defaults as $template) {
            // Verifică dacă șablonul există deja
            if (!EmailTemplate::where('key', $template['key'])->exists()) {
                // Extrage variabilele
                preg_match_all('/{([a-zA-Z_]+)}/', $template['body'] . $template['subject'], $matches);
                $template['variables'] = array_unique($matches[1]);

                EmailTemplate::create($template);
                $created++;
            } else {
                $skipped++;
            }
        }

        return response()->json([
            'success' => true,
            'message' => "Au fost create {$created} șabloane noi. {$skipped} șabloane existau deja."
        ]);
    }

    /**
     * Export șabloane în format JSON
     */
    public function export()
    {
        $templates = EmailTemplate::all()->map(function ($template) {
            return [
                'key' => $template->key,
                'name' => $template->name,
                'category' => $template->category,
                'subject' => $template->subject,
                'body' => $template->body,
                'description' => $template->description,
                'is_active' => $template->is_active,
                'variables' => $template->variables
            ];
        });

        $filename = 'email_templates_' . date('Y-m-d_H-i-s') . '.json';

        return response()->json($templates)
            ->header('Content-Disposition', 'attachment; filename="' . $filename . '"')
            ->header('Content-Type', 'application/json');
    }

    /**
     * Import șabloane din JSON
     */
    public function import(Request $request)
    {
        $request->validate([
            'file' => 'required|file|mimes:json|max:2048'
        ]);

        try {
            $content = file_get_contents($request->file('file')->getPathname());
            $templates = json_decode($content, true);

            if (!is_array($templates)) {
                throw new \Exception('Format JSON invalid');
            }

            $imported = 0;
            $updated = 0;

            foreach ($templates as $templateData) {
                // Validare minimă
                if (empty($templateData['key']) || empty($templateData['name'])) {
                    continue;
                }

                $existing = EmailTemplate::where('key', $templateData['key'])->first();

                if ($existing) {
                    $existing->update($templateData);
                    $updated++;
                } else {
                    EmailTemplate::create($templateData);
                    $imported++;
                }
            }

            return response()->json([
                'success' => true,
                'message' => "Import finalizat: {$imported} șabloane noi, {$updated} actualizate."
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Eroare la import: ' . $e->getMessage()
            ], 500);
        }
    }
}
