<?php

declare(strict_types=1);

namespace App\Domain\MailServer\Adapters;

use App\Domain\Sysapi\Contracts\SysapiBridge;
use Illuminate\Support\Facades\Mail;

/**
 * Harici SMTP relay — Mailgun / AWS SES / SendGrid / Postmark / Yandex 360 / Google Workspace.
 *
 * Yerel mail server kurmak istemeyen veya yüksek teslim oranı (deliverability)
 * için profesyonel relay kullanmak isteyen müşteriler için. Settings'ten SMTP
 * host/port/user/pass girilir.
 */
class ExternalRelayAdapter extends AbstractMailServerAdapter
{
    public function __construct(?SysapiBridge $sysapi = null)
    {
        // ExternalRelay sysapi'ye gerek duymaz — null tolere et
        if ($sysapi) {
            parent::__construct($sysapi);
        }
    }

    public function name(): string
    {
        return 'Harici SMTP Relay';
    }

    public function key(): string
    {
        return 'relay';
    }

    public function description(): string
    {
        return 'Mailgun, AWS SES, SendGrid, Postmark veya Yandex 360 gibi profesyonel mail '
            . 'sağlayıcı kullanın. En yüksek teslim oranı için önerilir — IP itibarı sıfır risk.';
    }

    public function packageName(): string
    {
        return '';  // Paket gerekmez, sadece config
    }

    public function serviceName(): string
    {
        return '';  // Service yok
    }

    public function strengths(): array
    {
        return [
            'En yüksek deliverability (Gmail/Outlook spam değil)',
            'IP itibarı şirketin sorumluluğunda',
            'Bounce/spam complaint webhook desteği',
            'Sunucuya MTA kurmak gerekmez',
        ];
    }

    public function performanceScore(): int
    {
        return 95;
    }

    public function isInstalled(): bool
    {
        return ! empty(config('mail.mailers.smtp.host'))
            && config('mail.mailers.smtp.host') !== '127.0.0.1';
    }

    public function isRunning(): bool
    {
        if (! $this->isInstalled()) {
            return false;
        }

        $host = config('mail.mailers.smtp.host');
        $port = (int) config('mail.mailers.smtp.port', 587);

        $socket = @fsockopen($host, $port, $errno, $errstr, 5);
        if ($socket) {
            fclose($socket);
            return true;
        }

        return false;
    }

    public function isEnabled(): bool
    {
        return $this->isInstalled();
    }

    public function version(): string
    {
        $host = config('mail.mailers.smtp.host', 'unknown');

        return "Relay: {$host}";
    }

    public function install(): array
    {
        // External relay "kurulu" sayılmaz — config ile yapılandırılır
        return [
            'ok' => false,
            'output' => 'Harici SMTP relay kurulum gerektirmez. Settings > E-posta\'dan SMTP host/port/credentials girin.',
        ];
    }

    public function uninstall(): array
    {
        return ['ok' => true, 'output' => 'Harici relay konfigürasyonu Settings > E-posta\'dan kaldırılır.'];
    }

    public function start(): void {}
    public function stop(): void {}
    public function reload(): void {}
    public function restart(): void {}
    public function enable(): void {}
    public function disable(): void {}

    public function sendTestMail(string $to, string $from): void
    {
        Mail::raw('Onoxsoft Panel external SMTP test — ' . now()->toIso8601String(), function ($msg) use ($to, $from) {
            $msg->to($to)->from($from)->subject('Onoxsoft External SMTP Test');
        });
    }

    public function queueStatus(): array
    {
        try {
            $count = \DB::table('jobs')->count();
            $failed = \DB::table('failed_jobs')->count();

            return [
                'count' => $count,
                'oldest_seconds' => null,
                'frozen' => $failed,
            ];
        } catch (\Throwable) {
            return ['count' => 0, 'oldest_seconds' => null, 'frozen' => 0];
        }
    }

    public function flushQueue(): void
    {
        try {
            \Artisan::call('queue:retry', ['id' => 'all']);
        } catch (\Throwable) {
            // Sessizce yut
        }
    }

    public function laravelConfig(): array
    {
        return [
            'mailer' => 'smtp',
            'host' => config('mail.mailers.smtp.host'),
            'port' => config('mail.mailers.smtp.port', 587),
            'username' => config('mail.mailers.smtp.username'),
            'password' => config('mail.mailers.smtp.password'),
            'encryption' => config('mail.mailers.smtp.scheme', 'tls'),
            'auth_mode' => 'login',
        ];
    }
}
