<?php

declare(strict_types=1);

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Mail\AccountSuspendedMail;
use App\Mail\AccountTerminatedMail;
use App\Mail\AccountUnsuspendedMail;
use App\Mail\BackupCompletedMail;
use App\Mail\BackupFailedMail;
use App\Mail\InvoiceReadyMail;
use App\Mail\LoginFromNewDeviceMail;
use App\Mail\PackageDowngradedMail;
use App\Mail\PackageUpgradedMail;
use App\Mail\PasswordChangedMail;
use App\Mail\QuotaExceededMail;
use App\Mail\QuotaWarningMail;
use App\Mail\ResellerWelcomeMail;
use App\Mail\SslExpiredMail;
use App\Mail\SslExpiringMail;
use App\Mail\SslIssuedMail;
use App\Mail\SystemAlertMail;
use App\Mail\TestMail;
use App\Mail\TwoFactorEnabledMail;
use App\Mail\WelcomeNewAccount;
use Database\Factories\AccountFactory;
use Database\Factories\SslCertificateFactory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Mail\Mailable;
use Illuminate\Support\Facades\Mail;
use Inertia\Inertia;
use Inertia\Response as InertiaResponse;

class EmailTemplateController extends Controller
{
    private const TEMPLATES = [
        ['key' => 'account.welcome',        'name' => 'Hoş Geldiniz',              'class' => WelcomeNewAccount::class,       'description' => 'Yeni hesap oluşturulduğunda'],
        ['key' => 'account.suspended',      'name' => 'Hesap Askıya Alındı',       'class' => AccountSuspendedMail::class,    'description' => 'Hesap suspend edildiğinde'],
        ['key' => 'account.unsuspended',    'name' => 'Hesap Aktif Edildi',        'class' => AccountUnsuspendedMail::class,  'description' => 'Hesap yeniden aktif edildiğinde'],
        ['key' => 'account.terminated',     'name' => 'Hesap Sonlandırıldı',       'class' => AccountTerminatedMail::class,   'description' => 'Hesap kalıcı silindiğinde'],
        ['key' => 'ssl.issued',             'name' => 'SSL Verildi',               'class' => SslIssuedMail::class,           'description' => 'Yeni SSL sertifikası alındığında'],
        ['key' => 'ssl.expiring',           'name' => 'SSL Yakında Doluyor',       'class' => SslExpiringMail::class,         'description' => 'SSL süresi 7 gün içinde dolacaksa'],
        ['key' => 'ssl.expired',            'name' => 'SSL Doldu',                 'class' => SslExpiredMail::class,          'description' => 'SSL süresi geçmişse'],
        ['key' => 'quota.warning',          'name' => 'Disk Kotası Uyarı (%85)',   'class' => QuotaWarningMail::class,        'description' => 'Disk kullanımı %85\'e ulaştığında'],
        ['key' => 'quota.exceeded',         'name' => 'Disk Kotası Doldu (%100)',  'class' => QuotaExceededMail::class,       'description' => 'Disk kotası tamamen dolduğunda'],
        ['key' => 'backup.completed',       'name' => 'Yedekleme Tamamlandı',      'class' => BackupCompletedMail::class,     'description' => 'Yedekleme başarıyla tamamlandığında'],
        ['key' => 'backup.failed',          'name' => 'Yedekleme Başarısız',       'class' => BackupFailedMail::class,        'description' => 'Yedekleme başarısız olduğunda'],
        ['key' => 'auth.password-changed',  'name' => 'Parola Değiştirildi',       'class' => PasswordChangedMail::class,     'description' => 'Kullanıcı parolasını değiştirdiğinde'],
        ['key' => 'auth.2fa-enabled',       'name' => 'İki Adımlı Doğrulama Aktif', 'class' => TwoFactorEnabledMail::class,   'description' => '2FA aktif edildiğinde'],
        ['key' => 'auth.new-device',        'name' => 'Yeni Cihazdan Giriş',       'class' => LoginFromNewDeviceMail::class,  'description' => 'Yeni cihaz/IP tespit edildiğinde'],
        ['key' => 'billing.invoice',        'name' => 'Fatura Hazır',              'class' => InvoiceReadyMail::class,        'description' => 'Fatura oluşturulduğunda'],
        ['key' => 'admin.system-alert',     'name' => 'Sistem Uyarısı (Admin)',    'class' => SystemAlertMail::class,         'description' => 'Kritik sistem olaylarında admin\'e'],
        ['key' => 'reseller.welcome',       'name' => 'Bayi Hoş Geldiniz',         'class' => ResellerWelcomeMail::class,     'description' => 'Yeni bayi oluşturulduğunda'],
        ['key' => 'package.upgraded',       'name' => 'Paket Yükseltildi',         'class' => PackageUpgradedMail::class,     'description' => 'Hesap paketi yükseltildiğinde'],
        ['key' => 'package.downgraded',     'name' => 'Paket Düşürüldü',           'class' => PackageDowngradedMail::class,   'description' => 'Hesap paketi düşürüldüğünde'],
        ['key' => 'test',                   'name' => 'SMTP Test',                 'class' => TestMail::class,                'description' => 'Admin SMTP test gönderimi'],
    ];

    public function index(): InertiaResponse
    {
        $templates = array_map(
            fn ($t) => array_diff_key($t, ['class' => '']),  // Vue'ya class göndermiyoruz
            self::TEMPLATES
        );

        return Inertia::render('Admin/EmailTemplates/Index', [
            'templates' => array_values($templates),
        ]);
    }

    public function preview(Request $request, string $key): Response
    {
        $mailable = $this->buildSampleMailable($key);

        return response($mailable->render(), 200, ['Content-Type' => 'text/html']);
    }

    public function sendTest(Request $request): RedirectResponse
    {
        $validated = $request->validate([
            'to' => ['required', 'email'],
            'template' => ['required', 'string'],
        ]);

        $mailable = $this->buildSampleMailable($validated['template']);
        Mail::to($validated['to'])->send($mailable);

        return back()->with('success', "Test maili gönderildi: {$validated['to']}");
    }

    private function buildSampleMailable(string $key): Mailable
    {
        $sampleAccount = AccountFactory::new()->make([
            'username' => 'onx_sample',
            'primary_domain' => 'sample.com',
        ]);
        $sampleAccount->id = 999;

        $sampleCert = SslCertificateFactory::new()->make([
            'common_name' => 'sample.com',
        ]);

        return match ($key) {
            'account.welcome' => new WelcomeNewAccount($sampleAccount, 'Gecici1234!', config('app.url').'/panel'),
            'account.suspended' => new AccountSuspendedMail($sampleAccount, 'Ödenmemiş fatura'),
            'account.unsuspended' => new AccountUnsuspendedMail($sampleAccount),
            'account.terminated' => new AccountTerminatedMail($sampleAccount, true),
            'ssl.issued' => new SslIssuedMail($sampleCert),
            'ssl.expiring' => new SslExpiringMail($sampleCert, 7),
            'ssl.expired' => new SslExpiredMail($sampleCert),
            'quota.warning' => new QuotaWarningMail($sampleAccount, 10737418240, 9126805504),   // 10 GB / 8.5 GB
            'quota.exceeded' => new QuotaExceededMail($sampleAccount, 10737418240, 10800000000),
            'backup.completed' => new BackupCompletedMail($sampleAccount, now()->format('d.m.Y H:i'), '2.4 GB', 'Tam Yedek'),
            'backup.failed' => new BackupFailedMail($sampleAccount, now()->format('d.m.Y H:i'), 'Disk alanı yetersiz'),
            'auth.password-changed' => new PasswordChangedMail('Ahmet Yılmaz', now()->format('d.m.Y H:i'), '88.248.100.1'),
            'auth.2fa-enabled' => new TwoFactorEnabledMail('Ahmet Yılmaz', now()->format('d.m.Y H:i'), '88.248.100.1'),
            'auth.new-device' => new LoginFromNewDeviceMail('Ahmet Yılmaz', '88.248.100.1', now()->format('d.m.Y H:i'), 'İstanbul, TR', 'Chrome 124 / macOS'),
            'billing.invoice' => new InvoiceReadyMail('Ahmet Yılmaz', 'INV-2026-001', '₺299,00', now()->format('d.m.Y'), now()->addDays(7)->format('d.m.Y')),
            'admin.system-alert' => new SystemAlertMail('Disk kullanımı kritik seviyede', '/var/www bölümü %95 dolu', 'KRİTİK', 'Disk', 'sda1', null, now()->format('d.m.Y H:i:s')),
            'reseller.welcome' => new ResellerWelcomeMail('Mehmet Bayi', 'reseller_mehmet', 'mehmet@example.com', 'Gecici5678!'),
            'package.upgraded' => new PackageUpgradedMail($sampleAccount, 'Başlangıç', 'Profesyonel'),
            'package.downgraded' => new PackageDowngradedMail($sampleAccount, 'Profesyonel', 'Başlangıç'),
            'test' => new TestMail,
            default => abort(404, "E-posta şablonu bulunamadı: {$key}"),
        };
    }
}
