<?php
namespace App\Http\Controllers\Tabelas;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

class TabelaController extends Controller
{
    private function tabelas(): array
    {
        return [
            'contest_date' => [
                'label'     => 'Contest Date',
                'icone'     => '📅',
                'descricao' => 'Datas e configurações do contest ativo (flag=1)',
                'pk'        => 'id',
                'editaveis' => ['name','start_date','end_date','limit_young','inicio_log','limit_log','flag'],
                'tipos'     => ['name'=>'text','start_date'=>'datetime-local','end_date'=>'datetime-local',
                                'limit_young'=>'date','inicio_log'=>'date','limit_log'=>'date','flag'=>'number'],
                'somente_leitura' => false,
            ],
            'exchange' => [
                'label'     => 'Exchanges Válidos',
                'icone'     => '🔄',
                'descricao' => 'Valores válidos de exchange (UFs + continentes)',
                'pk'        => 'idexchange',
                'editaveis' => ['exchange_value','uf_continente'],
                'tipos'     => ['exchange_value'=>'text','uf_continente'=>'text'],
                'somente_leitura' => false,
            ],
            'estaduais' => [
                'label'     => 'Estações HQ',
                'icone'     => '📡',
                'descricao' => 'Estações HQ das seccionais LABRE',
                'pk'        => 'id',
                'editaveis' => ['estadual','indicativo'],
                'tipos'     => ['estadual'=>'text','indicativo'=>'text'],
                'somente_leitura' => false,
            ],
            'band_freq' => [
                'label'     => 'Bandas / Frequências',
                'icone'     => '📻',
                'descricao' => 'Faixas de frequência válidas por banda',
                'pk'        => 'Id',
                'editaveis' => ['Banda','Frequencia_inicial','Frequencia_final'],
                'tipos'     => ['Banda'=>'text','Frequencia_inicial'=>'text','Frequencia_final'=>'text'],
                'somente_leitura' => false,
            ],
            'categorias' => [
                'label'     => 'Categorias',
                'icone'     => '🏷️',
                'descricao' => 'Categorias do contest (73 categorias)',
                'pk'        => 'Id',
                'editaveis' => ['Operador','Potencia','Banda','Modo','concatenado','limit_horas','callsign','name'],
                'tipos'     => ['Operador'=>'text','Potencia'=>'text','Banda'=>'text','Modo'=>'text',
                                'concatenado'=>'text','limit_horas'=>'number','callsign'=>'text','name'=>'text'],
                'somente_leitura' => false,
            ],
            'clubsbrasil' => [
                'label'     => 'Clubes Brasil',
                'icone'     => '🏛️',
                'descricao' => 'Clubes de radioamadorismo do Brasil',
                'pk'        => 'id',
                'editaveis' => ['nome'],
                'tipos'     => ['nome'=>'text'],
                'somente_leitura' => false,
            ],
            'records' => [
                'label'     => 'Records',
                'icone'     => '🏆',
                'descricao' => 'Recordes históricos por categoria',
                'pk'        => 'id',
                'editaveis' => ['category','callsign_ant','name_ant','final_score_ant','callsign_atu','name_atu','final_score_atu'],
                'tipos'     => ['category'=>'text','callsign_ant'=>'text','name_ant'=>'text',
                                'final_score_ant'=>'number','callsign_atu'=>'text','name_atu'=>'text','final_score_atu'=>'number'],
                'somente_leitura' => false,
            ],
            'logs_cabecalhos' => [
                'label'     => 'LOGs — Cabeçalhos',
                'icone'     => '📋',
                'descricao' => 'Cabeçalhos dos LOGs importados',
                'pk'        => 'id',
                'editaveis' => ['callsign','category_operator','category_band','category_mode',
                                'category_power','category_overlay','claimed_score','name','club','email'],
                'tipos'     => ['callsign'=>'text','category_operator'=>'text','category_band'=>'text',
                                'category_mode'=>'text','category_power'=>'text','category_overlay'=>'text',
                                'claimed_score'=>'number','name'=>'text','club'=>'text','email'=>'email'],
                'somente_leitura' => false,
            ],
            'resultados_final' => [
                'label'     => 'Resultados Final',
                'icone'     => '📊',
                'descricao' => 'Resultado consolidado por categoria (somente leitura)',
                'pk'        => 'id',
                'editaveis' => [],
                'tipos'     => [],
                'somente_leitura' => true,
            ],
            'qsos_result' => [
                'label'     => 'QSOs Result',
                'icone'     => '📡',
                'descricao' => 'QSOs processados — tabela principal (somente leitura)',
                'pk'        => 'id',
                'editaveis' => [],
                'tipos'     => [],
                'somente_leitura' => true,
            ],
        ];
    }

    public function index()
    {
        $tabelas = $this->tabelas();
        foreach ($tabelas as $key => &$t) {
            try { $t['total'] = DB::table($key)->count(); }
            catch (\Throwable) { $t['total'] = '—'; }
        }
        return view('tabelas.index', compact('tabelas'));
    }

    public function show(Request $request, string $tabela)
    {
        $tabelas = $this->tabelas();
        abort_unless(isset($tabelas[$tabela]), 404, "Tabela não configurada: {$tabela}");
        $config = $tabelas[$tabela];
        $busca  = $request->input('q', '');
        $porPag = (int)$request->input('por_pagina', 25);
        $porPag = in_array($porPag, [10,25,50,100]) ? $porPag : 25;

        $query = DB::table($tabela);
        if ($busca && !empty($config['editaveis'])) {
            $query->where(function ($q) use ($config, $busca) {
                foreach ($config['editaveis'] as $col) {
                    $q->orWhere($col, 'like', "%{$busca}%");
                }
            });
        }

        $registros = $query->paginate($porPag)->withQueryString();
        $colunas   = Schema::getColumnListing($tabela);

        return view('tabelas.show', compact('tabela','config','registros','colunas','busca','porPag'));
    }

    public function create(string $tabela)
    {
        $tabelas = $this->tabelas();
        abort_unless(isset($tabelas[$tabela]), 404);
        $config = $tabelas[$tabela];
        abort_if($config['somente_leitura'], 403, 'Esta tabela é somente leitura.');
        return view('tabelas.create', compact('tabela','config'));
    }

    public function store(Request $request, string $tabela)
    {
        $tabelas = $this->tabelas();
        abort_unless(isset($tabelas[$tabela]), 404);
        $config = $tabelas[$tabela];
        abort_if($config['somente_leitura'], 403);

        $dados = array_map(fn($v) => $v === '' ? null : $v, $request->only($config['editaveis']));
        $novoId = DB::table($tabela)->insertGetId($dados);

        activity()->causedBy(auth()->user())->log("Tabela {$tabela} — registro #{$novoId} inserido.");

        return redirect()->route('tabelas.show', $tabela)
                         ->with('sucesso', "Registro #{$novoId} inserido com sucesso.");
    }

    public function edit(string $tabela, $id)
    {
        $tabelas = $this->tabelas();
        abort_unless(isset($tabelas[$tabela]), 404);
        $config = $tabelas[$tabela];
        abort_if($config['somente_leitura'], 403, 'Esta tabela é somente leitura.');

        $registro = DB::table($tabela)->where($config['pk'], $id)->first();
        abort_unless($registro, 404, 'Registro não encontrado.');
        $colunas = Schema::getColumnListing($tabela);

        return view('tabelas.edit', compact('tabela','config','registro','id','colunas'));
    }

    public function update(Request $request, string $tabela, $id)
    {
        $tabelas = $this->tabelas();
        abort_unless(isset($tabelas[$tabela]), 404);
        $config = $tabelas[$tabela];
        abort_if($config['somente_leitura'], 403);

        $dados = array_map(fn($v) => $v === '' ? null : $v, $request->only($config['editaveis']));
        DB::table($tabela)->where($config['pk'], $id)->update($dados);

        activity()->causedBy(auth()->user())->log("Tabela {$tabela} — registro #{$id} atualizado.");

        return redirect()->route('tabelas.show', $tabela)
                         ->with('sucesso', "Registro #{$id} atualizado com sucesso.");
    }

    public function destroy(string $tabela, $id)
    {
        $tabelas = $this->tabelas();
        abort_unless(isset($tabelas[$tabela]), 404);
        $config = $tabelas[$tabela];
        abort_if($config['somente_leitura'], 403);

        DB::table($tabela)->where($config['pk'], $id)->delete();

        activity()->causedBy(auth()->user())->log("Tabela {$tabela} — registro #{$id} excluído.");

        return redirect()->route('tabelas.show', $tabela)
                         ->with('sucesso', "Registro #{$id} excluído.");
    }
}
