<?php

namespace App\Console\Commands;

use App\Models\Mail\MailAccount;
use App\Services\Mail\MailSyncService;
use Illuminate\Console\Command;

/**
 * Bağlı e-posta hesaplarını arka planda senkronize eder.
 *
 * Zamanlanmış çalıştırma (routes/console.php veya bootstrap/app.php):
 *   Schedule::command('mail:sync')->everyFiveMinutes()->withoutOverlapping();
 */
class SyncMailAccounts extends Command
{
    protected $signature = 'mail:sync
                            {--account= : Yalnızca bu hesap kimliği}
                            {--force : Eşitleme aralığını yok say}
                            {--reset : Yerel önbelleği silip baştan indir (sunucuya dokunmaz)}';

    protected $description = 'IMAP hesaplarını senkronize eder (klasörler, yeni iletiler, bayraklar)';

    public function handle(MailSyncService $sync): int
    {
        $query = MailAccount::where('is_active', true)->where('sync_enabled', true);

        if ($id = $this->option('account')) {
            $query->where('id', (int) $id);
        }

        $accounts = $query->orderBy('id')->get();

        if ($accounts->isEmpty()) {
            $this->info('Senkronize edilecek hesap yok.');

            return self::SUCCESS;
        }

        $failed = 0;

        foreach ($accounts as $account) {
            // Kendi aralığı dolmadıysa atla (yoğun sunucuları yormamak için)
            if (! $this->option('force') && $account->last_synced_at
                && $account->last_synced_at->diffInMinutes(now()) < max(1, (int) $account->sync_interval_minutes)) {
                continue;
            }

            $this->line("→ {$account->email}");

            if ($this->option('reset')) {
                $sync->resetCache($account);
                $this->line('   yerel önbellek temizlendi, baştan indiriliyor');
            }

            try {
                $stats = $sync->syncAccount($account);
                $this->info("   {$stats['new']} yeni · {$stats['updated']} güncellendi · {$stats['folders']} klasör");
            } catch (\Throwable $e) {
                $failed++;
                $this->error('   '.$e->getMessage());
            }
        }

        $sync->closeAll();

        return $failed > 0 ? self::FAILURE : self::SUCCESS;
    }
}
