<?php

namespace Database\Seeders;

use App\Models\Agency\Agency;
use App\Models\Mail\MailAccount;
use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Str;

/**
 * Kaliru Turizm e-posta hesaplarını bağlar.
 *
 * Tümü aynı cPanel sunucusunda: mail.kaliruturizm.com.tr
 * Gelen IMAP 993 (örtük TLS), giden SMTP 465 (örtük TLS).
 *
 * GÜVENLİK: Parolalar bu dosyada gömülü durur ve depoya işlenir. Depoya
 * erişen herkes görür. İstenirse her hesabın parolası `.env` üzerinden
 * geçilebilir — anahtar, e-posta adresinin yerel kısmının büyük harfli
 * hâlidir ve içinde `#` geçen değerler tırnaklanmalıdır:
 *
 *     MAIL_SEED_PASSWORD_OPERASYON="…"
 *     MAIL_SEED_PASSWORD_MCGURUZ="#pgb3CR7B9"
 *
 * Yeniden çalıştırılabilir: aynı (acente, e-posta) çifti varsa günceller.
 * Klasör ve iletileri indirmez — ardından `php artisan mail:sync --force`
 * çalıştırın ya da panelde Posta sayfasını açın (açılışta kendi eşitler).
 */
class MailAccountSeeder extends Seeder
{
    /** Tüm hesaplarda ortak sunucu ayarları. */
    private const SERVER = [
        'imap_host' => 'mail.kaliruturizm.com.tr',
        'imap_port' => 993,
        'imap_encryption' => 'ssl',
        'imap_validate_cert' => true,
        'smtp_host' => 'mail.kaliruturizm.com.tr',
        'smtp_port' => 465,
        'smtp_encryption' => 'ssl',
    ];

    /**
     * Hesaplar. `color` birleşik gelen kutusunda hesabı ayırt eden noktadır,
     * bu yüzden her hesaba ayrı renk verildi.
     *
     * @var array<int, array{email:string,password:string,name:string,from_name:string,color:string,default?:bool}>
     */
    private const ACCOUNTS = [
        ['email' => 'operasyon@kaliruturizm.com.tr', 'password' => '$#0jxilQwV', 'name' => 'operasyon', 'from_name' => 'Kaliru',         'color' => '#2563eb', 'default' => true],
        ['email' => 'info@kaliruturizm.com.tr',      'password' => '$&s3vaINj3', 'name' => 'info',      'from_name' => 'Kaliru Turizm',  'color' => '#0891b2'],
        ['email' => 'muhasebe@kaliruturizm.com.tr',  'password' => 'rD&LOPL@93', 'name' => 'muhasebe',  'from_name' => 'Kaliru Muhasebe', 'color' => '#16a34a'],
        ['email' => 'kaliru@kaliruturizm.com.tr',    'password' => 'VZls3B@pz5', 'name' => 'kaliru',    'from_name' => 'Kaliru Turizm',  'color' => '#7c3aed'],
        ['email' => 'sosyal@kaliruturizm.com.tr',    'password' => 'jZT2mH87$Y', 'name' => 'sosyal',    'from_name' => 'Kaliru Sosyal',  'color' => '#db2777'],
        ['email' => 'bilet@kaliruturizm.com.tr',     'password' => 'JRMA3E@yO1', 'name' => 'bilet',     'from_name' => 'Kaliru Bilet',   'color' => '#ea580c'],
        ['email' => 'mguruz@kaliruturizm.com.tr',    'password' => 'Ho3hAt*i^2', 'name' => 'mguruz',    'from_name' => 'Kaliru Turizm',  'color' => '#ca8a04'],
        ['email' => 'mcguruz@kaliruturizm.com.tr',   'password' => '#pgb3CR7B9', 'name' => 'mcguruz',   'from_name' => 'Kaliru Turizm',  'color' => '#be123c'],
    ];

    public function run(): void
    {
        $agency = Agency::find(1) ?? Agency::orderBy('id')->first();

        if (! $agency) {
            $this->command?->warn('MailAccountSeeder: acente bulunamadı, atlandı.');

            return;
        }

        // Kişisel hesap sahibi — bulunamazsa hesaplar acente geneli paylaşılan olur
        $owner = User::where('email', 'd@d.com')->first();

        foreach (self::ACCOUNTS as $index => $config) {
            $password = $this->password($config);

            MailAccount::updateOrCreate(
                [
                    'agency_id' => $agency->id,
                    'email' => $config['email'],
                ],
                array_merge(self::SERVER, [
                    'user_id' => $owner?->id,
                    'name' => $config['name'],
                    'from_name' => $config['from_name'],
                    'color' => $config['color'],

                    'imap_username' => $config['email'],
                    'imap_password' => $password,
                    'smtp_username' => $config['email'],
                    'smtp_password' => $password,

                    'is_active' => true,
                    'is_default' => $config['default'] ?? false,
                    'sync_enabled' => true,
                    'sync_interval_minutes' => 5,
                    'sync_days' => 90,

                    // Durum alanları ilk eşitlemede dolar
                    'status' => 'pending',
                    'last_error' => null,
                    'last_synced_at' => null,
                    'sort_order' => $index,
                ])
            );
        }

        $scope = $owner ? "kişisel ({$owner->email})" : 'acente geneli';
        $this->command?->info('MailAccountSeeder: '.count(self::ACCOUNTS)." hesap bağlandı — {$scope}.");
        $this->command?->line('  Postaları indirmek için: php artisan mail:sync --force');
    }

    /**
     * Parolayı önce ortam değişkeninden okur, yoksa tablodaki değere düşer.
     * Anahtar: MAIL_SEED_PASSWORD_<YEREL_KISIM> (ör. MAIL_SEED_PASSWORD_MUHASEBE)
     */
    private function password(array $config): string
    {
        $local = Str::upper(Str::before($config['email'], '@'));
        $local = (string) preg_replace('/[^A-Z0-9]/', '_', $local);

        return (string) env('MAIL_SEED_PASSWORD_'.$local, $config['password']);
    }
}
