<?php

declare(strict_types=1);

function yes_no_field(string $label, string $case = 'lower', string $help = ''): array
{
    $options = $case === 'title'
        ? ['Yes' => 'Ativo', 'No' => 'Desativado']
        : ['yes' => 'Ativo', 'no' => 'Desativado'];
    return ['label' => $label, 'type' => 'select', 'options' => $options, 'help' => $help];
}

function active_field(string $label, string $help = ''): array
{
    return ['label' => $label, 'type' => 'select', 'options' => ['ACTIVE' => 'Ativo', 'INACTIVE' => 'Inativo'], 'help' => $help];
}

function app_language_options(): array
{
    return [
        'en' => 'English (US)',
        'ar' => 'Arabic (AR)',
        'bn' => 'Bangla (BN)',
        'zh' => 'Chinese (ZH)',
        'fr' => 'French (FR)',
        'de' => 'German (DE)',
        'hi' => 'Hindi (HI)',
        'it' => 'Italian (IT)',
        'hr' => 'Croatian (HR)',
        'ml' => 'Malayalam (ML)',
        'pl' => 'Polish (PL)',
        'pt' => 'Portuguese (PT-BR)',
        'es' => 'Spanish (ES)',
        'ro' => 'Romanian (RO)',
        'ru' => 'Russian (RU)',
        'sv' => 'Swedish (SV)',
        'tr' => 'Turkish (TR)',
    ];
}

function app_fields(): array
{
    return [
        'core' => [
            'title' => 'Identidade e licença do aplicativo',
            'icon' => 'fa-mobile-screen-button',
            'description' => 'Valores principais utilizados na resposta licV4 do aplicativo.',
            'fields' => [
                'appname' => ['label' => 'Nome do aplicativo', 'type' => 'text', 'help' => 'Nome enviado no bloco app. Não altera o nome instalado no APK.'],
                'cid' => ['label' => 'CID da configuração', 'type' => 'number', 'help' => 'Mantenha 1, salvo quando a base do aplicativo exigir outro identificador.'],
                'status' => active_field('Status geral do aplicativo'),
                'expire' => ['label' => 'Data de expiração global', 'type' => 'text', 'placeholder' => 'Deixe vazio para não limitar'],
                'login_type' => ['label' => 'Tipo de login', 'type' => 'select', 'options' => ['xtreamcodes' => 'Xtream Codes', 'm3u' => 'M3U']],
                'version_code' => ['label' => 'Código da versão', 'type' => 'number'],
                'filter_status' => ['label' => 'Filtro de conteúdo', 'type' => 'select', 'options' => ['No' => 'Desativado', 'Yes' => 'Ativo']],
                'epg_mode' => yes_no_field('EPG habilitado'),
                'apkautoupdate' => yes_no_field('Atualização automática do APK', 'lower', 'Use “Desativado” para impedir o pop-up automático.'),
                'show_expire' => yes_no_field('Mostrar vencimento no aplicativo'),
                'expiry_popup_enabled' => yes_no_field('Exibir aviso de vencimento', 'lower', 'Quando desativado, o aplicativo ignora o popup de lembrete de vencimento.'),
            ],
        ],
        'portal' => [
            'title' => 'Comportamento dos portais',
            'icon' => 'fa-network-wired',
            'description' => 'As URLs e nomes são obtidos automaticamente da página DNS, por ordem de prioridade.',
            'fields' => [
                'panel' => ['label' => 'Tipo de painel', 'type' => 'select', 'options' => ['xtreamcodes' => 'Xtream Codes']],
                'portal_vod' => yes_no_field('Forçar portal exclusivo para filmes'),
                'portal_series' => yes_no_field('Forçar portal exclusivo para séries'),
            ],
        ],
        'urls' => [
            'title' => 'URLs complementares',
            'icon' => 'fa-link',
            'description' => 'Endpoints auxiliares recebidos pelo aplicativo.',
            'fields' => [
                'apkurl' => ['label' => 'URL do APK para atualização', 'type' => 'url', 'placeholder' => 'https://...'],
                'backupurl' => ['label' => 'URL de backup', 'type' => 'url', 'placeholder' => 'https://...'],
                'logurl' => ['label' => 'URL base/log', 'type' => 'url', 'placeholder' => 'Vazio = domínio atual do painel'],
                'activation_url' => ['label' => 'URL de ativação', 'type' => 'text', 'placeholder' => 'no ou https://...'],
                'socket_url' => ['label' => 'Servidor socket', 'type' => 'text'],
                'mqtt_url' => ['label' => 'Servidor MQTT', 'type' => 'text', 'placeholder' => 'Opcional'],
                'epg_url' => ['label' => 'URL EPG externa', 'type' => 'text', 'placeholder' => 'No ou https://...'],
                'ovpn_url' => ['label' => 'URL OpenVPN', 'type' => 'text', 'placeholder' => 'No ou https://...'],
            ],
        ],
        'vpn' => [
            'title' => 'OpenVPN / OVPN',
            'icon' => 'fa-shield-halved',
            'description' => 'Configuração enviada ao app para conexão OpenVPN interna antes do login automático.',
            'fields' => [
                'vpn_enabled' => yes_no_field('Ativar VPN no aplicativo'),
                'vpn_required' => yes_no_field('VPN obrigatória antes do login'),
                'vpn_auto_connect' => yes_no_field('Conectar VPN automaticamente'),
                'ovpn_url' => ['label' => 'URL direta do arquivo .ovpn', 'type' => 'url', 'placeholder' => 'Vazio = /api/vpn/config.ovpn', 'help' => 'Deixe vazio para usar o arquivo salvo em storage/vpn/config.ovpn.'],
                'ovpn_username' => ['label' => 'Usuário OpenVPN/IKEv2', 'type' => 'text', 'placeholder' => 'Usuário OpenVPN da Proton'],
                'ovpn_password' => ['label' => 'Senha OpenVPN/IKEv2', 'type' => 'password', 'placeholder' => 'Senha OpenVPN da Proton'],
                'ovpn_protocol' => ['label' => 'Protocolo', 'type' => 'select', 'options' => ['udp' => 'UDP', 'tcp' => 'TCP']],
                'ovpn_country' => ['label' => 'Nome/localização', 'type' => 'text', 'placeholder' => 'Ex.: RO-FREE#1'],
                'vpn_status_text' => ['label' => 'Texto de status', 'type' => 'text'],
            ],
        ],
        'support' => [
            'title' => 'Contato e suporte',
            'icon' => 'fa-headset',
            'description' => 'Informações de contato incluídas na resposta da API.',
            'fields' => [
                'support_email' => ['label' => 'E-mail de suporte', 'type' => 'email'],
                'support_phone' => ['label' => 'Telefone/WhatsApp', 'type' => 'text'],
                'support_text' => ['label' => 'Texto do Socorro', 'type' => 'textarea', 'rows' => '3', 'help' => 'Mensagem exibida junto do QR Code e enviada no texto inicial do WhatsApp.'],
                'support_link' => ['label' => 'Link direto de suporte', 'type' => 'url', 'placeholder' => 'Vazio = gera wa.me pelo telefone'],
                'support_qr_url' => ['label' => 'URL do QR Code', 'type' => 'url', 'placeholder' => 'Vazio = gerado automaticamente'],
            ],
        ],
    ];
}

function button_fields(): array
{
    $defaults = config_defaults()['buttons'];
    $labels = [
        'live' => 'TV ao vivo', 'vod' => 'Filmes', 'epg' => 'Guia EPG', 'series' => 'Séries',
        'catchup' => 'Catch Up', 'radio' => 'Rádio', 'fav' => 'Favoritos', 'account' => 'Conta',
    ];
    $fields = [];
    foreach ($defaults as $key => $default) {
        $label = $key;
        if (preg_match('/^btn_(live|vod|epg|series|catchup|radio|fav|account)([2-5]?)$/', $key, $m)) {
            $label = $labels[$m[1]] . ($m[2] !== '' ? ' — Portal ' . $m[2] : ' — Portal principal');
        } else {
            $custom = [
                'btn_pr' => 'Controle parental', 'btn_rec' => 'Gravações', 'btn_vpn' => 'VPN',
                'btn_noti' => 'Notificações', 'btn_update' => 'Atualização manual',
                'btn_login_settings' => 'Configurações no login', 'btn_login_account' => 'Conta no login',
                'btn_signup' => 'Cadastro no login', 'ms' => 'Multitela — Portal principal',
                'ms2' => 'Multitela — Portal 2', 'ms3' => 'Multitela — Portal 3',
                'ms4' => 'Multitela — Portal 4', 'ms5' => 'Multitela — Portal 5',
            ];
            $custom['btn_football'] = 'Futebol';
            $label = $custom[$key] ?? $key;
        }
        $case = in_array($default, ['Yes', 'No'], true) ? 'title' : 'lower';
        $fields[$key] = yes_no_field($label, $case);
    }
    return [
        'buttons' => [
            'title' => 'Visibilidade dos botões',
            'icon' => 'fa-table-cells-large',
            'description' => 'Ative ou desative recursos em cada um dos cinco portais suportados pela base.',
            'fields' => $fields,
        ],
    ];
}

function interface_fields(): array
{
    return [
        'interface' => [
            'title' => 'Interface e comportamento',
            'icon' => 'fa-sliders',
            'description' => 'Opções lidas no bloco settings do retorno do aplicativo.',
            'fields' => [
                'agent' => ['label' => 'User-Agent/nome interno', 'type' => 'text'],
                'all_cat' => yes_no_field('Exibir categoria “Todos”'),
                'message_enabled' => yes_no_field('Habilitar mensagens'),
                'announcement_enabled' => yes_no_field('Habilitar anúncios de texto'),
                'updateuserinfo_enabled' => yes_no_field('Atualizar dados da conta'),
                'whatsupcheck_enabled' => yes_no_field('Verificação WhatsUp'),
                'login_logo' => yes_no_field('Exibir logo no login'),
                'bjob' => yes_no_field('Tarefa em segundo plano'),
                'settings_app' => yes_no_field('Exibir configurações do app'),
                'settings_account' => yes_no_field('Exibir configurações da conta'),
                'logs' => yes_no_field('Coleta de logs'),
                'app_language' => ['label' => 'Idioma padrão', 'type' => 'select', 'options' => app_language_options()],
                'load_last_channel' => yes_no_field('Carregar último canal'),
                'admob_banner_id' => ['label' => 'ID AdMob Banner', 'type' => 'text', 'placeholder' => 'no ou ca-app-pub-...'],
                'admob_interstitial_id' => ['label' => 'ID AdMob Interstitial', 'type' => 'text', 'placeholder' => 'no ou ca-app-pub-...'],
                'show_cat_count' => yes_no_field('Mostrar quantidade nas categorias'),
                'send_udid' => yes_no_field('Enviar identificador do dispositivo'),
                'theme' => ['label' => 'ID do tema', 'type' => 'number', 'min' => '1'],
                'vpn_login_view' => yes_no_field('Mostrar VPN no login'),
                'hide_other_login_type' => yes_no_field('Ocultar outros tipos de login (compatibilidade antiga)'),
            ],
        ],
        'others' => [
            'title' => 'Funções avançadas detectadas no APK',
            'icon' => 'fa-gears',
            'description' => 'Bloco opcional others lido diretamente pela SplashActivity da base OmniMax.',
            'fields' => [
                'bg_epg_update' => yes_no_field('Atualização do EPG em segundo plano'),
                'reset_all_settings' => yes_no_field('Forçar redefinição das configurações', 'lower', 'Ative somente quando precisar limpar as preferências salvas nos aparelhos.'),
                'reset_all_settings_seq' => ['label' => 'Sequência da redefinição', 'type' => 'number', 'min' => '1', 'help' => 'Aumente este número para executar uma nova redefinição nos dispositivos.'],
                'max_epg_file_size' => ['label' => 'Tamanho máximo do arquivo EPG', 'type' => 'number', 'min' => '1', 'placeholder' => 'Opcional'],
                'hide_other_login_type' => yes_no_field('Ocultar outros tipos de login'),
                'hide_recording' => yes_no_field('Ocultar gravações'),
                'hide_auto_conn_vpn' => yes_no_field('Ocultar conexão automática de VPN'),
            ],
        ],
    ];
}

function player_fields(): array
{
    return [
        'players' => [
            'title' => 'Players por conteúdo',
            'icon' => 'fa-circle-play',
            'description' => 'Selecione o mecanismo padrão para cada área do aplicativo.',
            'fields' => [
                'player' => ['label' => 'TV ao vivo (celular)', 'type' => 'select', 'options' => ['EXO' => 'ExoPlayer', 'VLC' => 'VLC']],
                'player_tv' => ['label' => 'TV ao vivo (Android TV)', 'type' => 'select', 'options' => ['EXO' => 'ExoPlayer', 'VLC' => 'VLC']],
                'player_vod' => ['label' => 'Filmes', 'type' => 'select', 'options' => ['EXO' => 'ExoPlayer', 'VLC' => 'VLC']],
                'player_series' => ['label' => 'Séries', 'type' => 'select', 'options' => ['EXO' => 'ExoPlayer', 'VLC' => 'VLC']],
                'player_catchup' => ['label' => 'Catch Up', 'type' => 'select', 'options' => ['EXO' => 'ExoPlayer', 'VLC' => 'VLC']],
                'stream_type' => ['label' => 'Formato padrão do stream', 'type' => 'select', 'options' => ['ts' => 'MPEG-TS', 'm3u8' => 'HLS/M3U8']],
            ],
        ],
        'playback' => [
            'title' => 'Desempenho e reprodução',
            'icon' => 'fa-gauge-high',
            'description' => 'Buffers, aceleração por hardware, volume e redimensionamento.',
            'fields' => [
                'vlc_hw' => yes_no_field('VLC: aceleração por hardware'),
                'last_volume_vlc' => ['label' => 'VLC: volume inicial', 'type' => 'number', 'min' => '0', 'max' => '100'],
                'plyer_vlc_buffer' => ['label' => 'VLC: buffer (ms)', 'type' => 'number', 'min' => '0'],
                'video_resize_vlc' => ['label' => 'VLC: modo de redimensionamento', 'type' => 'number', 'min' => '0'],
                'video_subtiltes_vlc' => yes_no_field('VLC: legendas'),
                'exo_hw' => yes_no_field('ExoPlayer: aceleração por hardware'),
                'last_volume_exo' => ['label' => 'ExoPlayer: volume inicial', 'type' => 'number', 'min' => '0', 'max' => '100'],
                'plyer_exo_buffer' => ['label' => 'ExoPlayer: buffer (ms)', 'type' => 'number', 'min' => '0'],
                'video_resize_exo' => ['label' => 'ExoPlayer: modo de redimensionamento', 'type' => 'number', 'min' => '0'],
                'video_subtiltes_exo' => yes_no_field('ExoPlayer: legendas'),
            ],
        ],
    ];
}

function message_fields(): array
{
    return [
        'messages' => [
            'title' => 'Mensagens, avisos e filtros',
            'icon' => 'fa-bullhorn',
            'description' => 'Conteúdo devolvido nas chamadas connv2, msg, ann, whatsup e gfilter.',
            'fields' => [
                'message' => ['label' => 'Mensagem principal', 'type' => 'textarea', 'rows' => '4'],
                'msgid' => ['label' => 'ID da mensagem', 'type' => 'number'],
                'msg_status' => active_field('Status da mensagem'),
                'msg_expire' => ['label' => 'Expiração da mensagem', 'type' => 'text', 'placeholder' => '2099-12-31 23:59:59'],
                'announcement' => ['label' => 'Anúncio/comunicado', 'type' => 'textarea', 'rows' => '4'],
                'ann_status' => active_field('Status do comunicado'),
                'ann_expire' => ['label' => 'Expiração do comunicado', 'type' => 'text', 'placeholder' => '2099-12-31 23:59:59'],
                'ann_interval' => ['label' => 'Intervalo do comunicado', 'type' => 'number', 'min' => '1'],
                'ann_disappear' => ['label' => 'Tempo para desaparecer', 'type' => 'number', 'min' => '1'],
                'whatsup' => yes_no_field('WhatsUp ativo'),
                'gfilter_status' => ['label' => 'Status do filtro', 'type' => 'select', 'options' => ['No' => 'Desativado', 'Yes' => 'Ativo']],
                'filter_json' => ['label' => 'Filtro em JSON', 'type' => 'textarea', 'rows' => '5', 'placeholder' => '[]', 'help' => 'Use um array JSON válido. Em caso de erro, o aplicativo receberá uma lista vazia.'],
                'category_message' => ['label' => 'Mensagem quando não houver avisos', 'type' => 'text'],
            ],
        ],
    ];
}

function ad_fields(): array
{
    return [
        'admob' => [
            'title' => 'AdMob', 'icon' => 'fa-rectangle-ad',
            'description' => 'Ativação global do bloco AdMob.',
            'fields' => ['admob_enabled' => yes_no_field('AdMob habilitado')],
        ],
        'prebid' => [
            'title' => 'Prebid', 'icon' => 'fa-code',
            'description' => 'Configuração de inventário Prebid enviada ao aplicativo.',
            'fields' => [
                'prebid_enabled' => yes_no_field('Prebid habilitado'),
                'Host' => ['label' => 'Host', 'type' => 'text'],
                'AdUnitId' => ['label' => 'Ad Unit ID', 'type' => 'text'],
                'AccountId' => ['label' => 'Account ID', 'type' => 'text'],
                'Banner' => ['label' => 'Banner', 'type' => 'text'],
            ],
        ],
        'vast' => [
            'title' => 'VAST', 'icon' => 'fa-video',
            'description' => 'URLs e intervalos de anúncios em filmes e séries.',
            'fields' => [
                'vast_enabled' => yes_no_field('VAST habilitado'),
                'mid_roll_interval' => ['label' => 'Intervalo geral Mid-roll', 'type' => 'number'],
                'post_roll_start_at' => ['label' => 'Início do Post-roll', 'type' => 'number'],
                'vod_mid_roll_interval' => ['label' => 'Filmes: intervalo Mid-roll', 'type' => 'number'],
                'vod_pre_roll_url' => ['label' => 'Filmes: URL Pre-roll', 'type' => 'url'],
                'vod_mid_roll_url' => ['label' => 'Filmes: URL Mid-roll', 'type' => 'url'],
                'vod_post_roll_url' => ['label' => 'Filmes: URL Post-roll', 'type' => 'url'],
                'series_mid_roll_interval' => ['label' => 'Séries: intervalo Mid-roll', 'type' => 'number'],
                'series_pre_roll_url' => ['label' => 'Séries: URL Pre-roll', 'type' => 'url'],
                'series_mid_roll_url' => ['label' => 'Séries: URL Mid-roll', 'type' => 'url'],
                'series_post_roll_url' => ['label' => 'Séries: URL Post-roll', 'type' => 'url'],
            ],
        ],
        'ads' => [
            'title' => 'Outras redes', 'icon' => 'fa-chart-line',
            'description' => 'Compatibilidade com Freestar.',
            'fields' => ['freestar' => yes_no_field('Freestar habilitado')],
        ],
    ];
}

function maintenance_fields(): array
{
    return [
        'maintenance' => [
            'title' => 'Modo manutenção',
            'icon' => 'fa-screwdriver-wrench',
            'description' => 'Quando ativo, a base poderá bloquear o acesso e exibir a mensagem definida.',
            'fields' => [
                'mnt_status' => active_field('Status da manutenção'),
                'mnt_message' => ['label' => 'Mensagem de manutenção', 'type' => 'textarea', 'rows' => '5'],
                'mnt_expire' => ['label' => 'Data final', 'type' => 'text', 'placeholder' => '2099-12-31 23:59:59'],
            ],
        ],
    ];
}
