-- Adaptar a estrutura da tabela configuracoes existente

-- 1. Ver estrutura atual
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_schema = 'public' 
AND table_name = 'configuracoes'
ORDER BY ordinal_position;

-- 2. Se a coluna é 'chave' e não 'tipo', vamos renomear
DO $$
BEGIN
    -- Verificar se existe a coluna 'chave'
    IF EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_schema = 'public' 
        AND table_name = 'configuracoes' 
        AND column_name = 'chave'
    ) AND NOT EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_schema = 'public' 
        AND table_name = 'configuracoes' 
        AND column_name = 'tipo'
    ) THEN
        -- Renomear 'chave' para 'tipo'
        ALTER TABLE public.configuracoes RENAME COLUMN chave TO tipo;
        RAISE NOTICE 'Coluna renomeada de chave para tipo';
    END IF;
    
    -- Garantir que a coluna tipo existe
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_schema = 'public' 
        AND table_name = 'configuracoes' 
        AND column_name = 'tipo'
    ) THEN
        ALTER TABLE public.configuracoes ADD COLUMN tipo character varying NOT NULL DEFAULT '';
        RAISE NOTICE 'Coluna tipo adicionada';
    END IF;
    
    -- Garantir que a coluna valor existe e é jsonb
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_schema = 'public' 
        AND table_name = 'configuracoes' 
        AND column_name = 'valor'
    ) THEN
        ALTER TABLE public.configuracoes ADD COLUMN valor jsonb;
        RAISE NOTICE 'Coluna valor adicionada';
    END IF;
    
    -- Se existe coluna 'valor_str' ou 'valor_string', migrar para 'valor' jsonb
    IF EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_schema = 'public' 
        AND table_name = 'configuracoes' 
        AND column_name IN ('valor_str', 'valor_string')
    ) THEN
        -- Tentar converter os dados
        UPDATE public.configuracoes 
        SET valor = COALESCE(valor_str::jsonb, valor_string::jsonb)
        WHERE valor IS NULL;
        RAISE NOTICE 'Dados migrados para coluna valor';
    END IF;
END $$;

-- 3. Remover constraint NOT NULL da coluna chave se ainda existir
DO $$
BEGIN
    IF EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_schema = 'public' 
        AND table_name = 'configuracoes' 
        AND column_name = 'chave'
        AND is_nullable = 'NO'
    ) THEN
        ALTER TABLE public.configuracoes ALTER COLUMN chave DROP NOT NULL;
        RAISE NOTICE 'Constraint NOT NULL removida da coluna chave';
    END IF;
END $$;

-- 4. Adicionar constraint UNIQUE na coluna tipo
DO $$
BEGIN
    -- Primeiro remover duplicados
    DELETE FROM public.configuracoes
    WHERE id IN (
        SELECT id
        FROM (
            SELECT id, tipo,
                   ROW_NUMBER() OVER (PARTITION BY tipo ORDER BY updated_at DESC NULLS LAST, created_at DESC) as rn
            FROM public.configuracoes
        ) t
        WHERE rn > 1
    );
    
    -- Adicionar constraint
    IF NOT EXISTS (
        SELECT 1 FROM pg_constraint 
        WHERE conname = 'configuracoes_tipo_key' 
        AND conrelid = 'public.configuracoes'::regclass
    ) THEN
        ALTER TABLE public.configuracoes ADD CONSTRAINT configuracoes_tipo_key UNIQUE (tipo);
        RAISE NOTICE 'Constraint UNIQUE adicionada em tipo';
    END IF;
END $$;

-- 5. Verificar resultado final
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_schema = 'public' 
AND table_name = 'configuracoes'
ORDER BY ordinal_position;

-- 6. Mostrar dados
SELECT * FROM public.configuracoes ORDER BY tipo;
