<?php

namespace App\Modules\Addon\MigrateWisecp\Services;

use Illuminate\Database\Connection;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\DB;

/**
 * PRC-1125 — WiseCP kaynak DB'sine SALT-OKUNUR ikinci Laravel bağlantısı.
 * WiseCP DB'ye ASLA yazmaz (yalnız SELECT). Creds addon ayarlarından gelir; runtime'da
 * `database.connections.wisecp_src` olarak register edilir.
 *
 * ⚠️ WiseCP tablo adları procp ile ÇAKIŞIR (clients/services/invoices/orders…) →
 * bu bağlantı procp DB'sinden AYRI bir DB'ye işaret etmeli (aksi hâlde procp'nin
 * kendi tablolarını okur). Admin bunu sağlar.
 */
class WisecpSourceConnection
{
    public const NAME = 'wisecp_src';

    /**
     * Runtime bağlantı config'ini kur. $creds: host, port, database, username, password.
     */
    public static function configure(array $creds): void
    {
        Config::set('database.connections.'.self::NAME, [
            'driver' => 'mysql',
            'host' => $creds['host'] ?? '127.0.0.1',
            'port' => $creds['port'] ?? '3306',
            'database' => $creds['database'] ?? '',
            'username' => $creds['username'] ?? '',
            'password' => $creds['password'] ?? '',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => false,
            // Salt-okunur niyet: write host'u yok; kod yalnız SELECT çalıştırır.
            'options' => [\PDO::ATTR_TIMEOUT => 10],
        ]);

        DB::purge(self::NAME); // önceki config'i temizle
    }

    /**
     * Kaynak bağlantı instance'ı (configure() sonrası).
     */
    public static function connection(): Connection
    {
        return DB::connection(self::NAME);
    }

    /**
     * Bir WiseCP tablosu için query builder (salt-okunur).
     */
    public static function table(string $table)
    {
        return self::connection()->table($table);
    }

    /**
     * Bağlantıyı test et: bağlan + WiseCP member (users type='member') say.
     * Dönüş: [ok, message, client_count].
     */
    public static function test(array $creds): array
    {
        try {
            self::configure($creds);
            $count = self::table('users')->where('type', 'member')->count();

            return [
                'ok' => true,
                'message' => 'Bağlantı başarılı — WiseCP `users` erişilebilir.',
                'client_count' => $count,
            ];
        } catch (\Throwable $e) {
            return [
                'ok' => false,
                // Not: creds/şifre mesaja gömülmez.
                'message' => 'Bağlantı başarısız: '.$e->getMessage(),
                'client_count' => 0,
            ];
        }
    }
}
