<?php

declare(strict_types=1);

namespace App\Domain\Migration\Sources;

use RuntimeException;

/**
 * Multi-source migration registry (Phase 2).
 *
 * Her source panel (cPanel/DirectAdmin/Plesk) için:
 *  - Display label
 *  - Sysapi action adları (test/list/pull/import)
 *  - "Account"a karşılık gelen terim (Plesk: subscription, cPanel/DA: account)
 *  - Default backup script path
 *  - Default port + login user
 *  - Backup file format hint
 *
 * Controller + UI bu registry'den okur — yeni panel eklemek tek nokta:
 *   /usr/local/onoxsoft/bin/onx-<slug>-* scriptleri + bu sınıfa entry.
 */
final class SourcePanelRegistry
{
    public const CPANEL = 'cpanel';
    public const DIRECTADMIN = 'directadmin';
    public const PLESK = 'plesk';

    /**
     * @return array<string, array<string, mixed>>
     */
    public static function all(): array
    {
        return [
            self::CPANEL => [
                'slug' => 'cpanel',
                'label' => 'cPanel / WHM',
                'short' => 'cPanel',
                'icon' => 'CpanelIcon',  // Vue icon ref
                'color' => 'sky',
                'account_term' => 'account',
                'account_term_tr' => 'hesap',
                'default_port' => 22,
                'default_root_user' => 'root',
                'sysapi' => [
                    'test_connection' => 'cpanel-test-connection',
                    'list_accounts' => 'cpanel-list-remote-accounts',
                    'pull_remote' => 'cpanel-pull-remote',
                    'import' => 'cpanel-import',
                ],
                'backup_script' => '/scripts/pkgacct',
                'backup_format' => 'cpmove-tar.gz',
                'api_methods' => ['whmapi1', 'cpapi2'],
                'notes_tr' => 'WHM root erişimi ile pkgacct çalıştırılır. Mevcut tüm cPanel sürümleri (60+) destekli.',
            ],
            self::DIRECTADMIN => [
                'slug' => 'directadmin',
                'label' => 'DirectAdmin',
                'short' => 'DirectAdmin',
                'icon' => 'DirectAdminIcon',
                'color' => 'orange',
                'account_term' => 'account',
                'account_term_tr' => 'hesap',
                'default_port' => 22,
                'default_root_user' => 'admin',  // DA admin user
                'sysapi' => [
                    'test_connection' => 'directadmin-test-connection',
                    'list_accounts' => 'directadmin-list-accounts',
                    'pull_remote' => 'directadmin-pull-remote',
                    'import' => 'directadmin-import',
                ],
                'backup_script' => '/usr/local/directadmin/scripts/admin_backup_user.sh',
                'backup_format' => 'user.tar.gz',
                'api_methods' => ['CMD_API_SHOW_ALL_USERS', 'CMD_API_SHOW_USER_CONFIG'],
                'notes_tr' => 'DirectAdmin admin yetkisi ile admin_backup_user.sh çalıştırılır. DA 1.60+ test edildi.',
            ],
            self::PLESK => [
                'slug' => 'plesk',
                'label' => 'Plesk Obsidian',
                'short' => 'Plesk',
                'icon' => 'PleskIcon',
                'color' => 'indigo',
                'account_term' => 'subscription',
                'account_term_tr' => 'abonelik',
                'default_port' => 22,
                'default_root_user' => 'root',
                'sysapi' => [
                    'test_connection' => 'plesk-test-connection',
                    'list_accounts' => 'plesk-list-subscriptions',
                    'pull_remote' => 'plesk-pull-remote',
                    'import' => 'plesk-import',
                ],
                'backup_script' => '/usr/local/psa/bin/pleskbackup',
                'backup_format' => 'pmbf',
                'api_methods' => ['plesk-cli', 'rest-api-v2'],
                'notes_tr' => 'Plesk root erişimi ile pleskbackup veya pkgexport çalıştırılır. Obsidian 18+ destekli.',
            ],
        ];
    }

    public static function get(string $slug): array
    {
        $all = self::all();
        if (! isset($all[$slug])) {
            throw new RuntimeException("Desteklenmeyen source panel: {$slug}. ".
                'Geçerli: '.implode(', ', array_keys($all)));
        }
        return $all[$slug];
    }

    public static function sysapiAction(string $slug, string $key): string
    {
        $panel = self::get($slug);
        if (! isset($panel['sysapi'][$key])) {
            throw new RuntimeException("Panel {$slug} için sysapi action {$key} tanımsız.");
        }
        return $panel['sysapi'][$key];
    }

    /**
     * @return array<string>
     */
    public static function slugs(): array
    {
        return array_keys(self::all());
    }

    /**
     * UI için liste — Inertia ile Vue'ya gönderilir.
     *
     * @return array<int, array<string, mixed>>
     */
    public static function forUi(): array
    {
        return array_values(array_map(function (array $panel): array {
            return [
                'slug' => $panel['slug'],
                'label' => $panel['label'],
                'short' => $panel['short'],
                'color' => $panel['color'],
                'account_term' => $panel['account_term'],
                'account_term_tr' => $panel['account_term_tr'],
                'default_port' => $panel['default_port'],
                'default_root_user' => $panel['default_root_user'],
                'backup_script' => $panel['backup_script'],
                'backup_format' => $panel['backup_format'],
                'notes_tr' => $panel['notes_tr'],
            ];
        }, self::all()));
    }
}
