-- =============================================
-- CONFIGURAÇÃO DE STORAGE (BUCKETS) NO SUPABASE
-- =============================================

-- Criar bucket para imagens de produtos
INSERT INTO storage.buckets (id, name, public, file_size_limit, allowed_mime_types)
VALUES (
  'produtos',
  'produtos',
  true,
  5242880, -- 5MB
  ARRAY['image/jpeg', 'image/png', 'image/webp', 'image/gif']
) ON CONFLICT (id) DO NOTHING;

-- Criar bucket para imagens do catálogo (otimizadas)
INSERT INTO storage.buckets (id, name, public, file_size_limit, allowed_mime_types)
VALUES (
  'catalogo',
  'catalogo',
  true,
  3145728, -- 3MB
  ARRAY['image/jpeg', 'image/png', 'image/webp']
) ON CONFLICT (id) DO NOTHING;

-- =============================================
-- POLÍTICAS DE ACESSO AOS BUCKETS
-- =============================================

-- Política para permitir upload de imagens de produtos (apenas usuários autenticados)
CREATE POLICY "Permitir upload de imagens de produtos" ON storage.objects
FOR INSERT WITH CHECK (
  bucket_id = 'produtos' AND
  auth.role() = 'authenticated'
);

-- Política para permitir leitura pública de imagens de produtos
CREATE POLICY "Permitir leitura pública de imagens de produtos" ON storage.objects
FOR SELECT USING (bucket_id = 'produtos');

-- Política para permitir atualização de imagens de produtos
CREATE POLICY "Permitir atualização de imagens de produtos" ON storage.objects
FOR UPDATE WITH CHECK (
  bucket_id = 'produtos' AND
  auth.role() = 'authenticated'
);

-- Política para permitir exclusão de imagens de produtos
CREATE POLICY "Permitir exclusão de imagens de produtos" ON storage.objects
FOR DELETE USING (
  bucket_id = 'produtos' AND
  auth.role() = 'authenticated'
);

-- Política para permitir upload de imagens do catálogo
CREATE POLICY "Permitir upload de imagens do catálogo" ON storage.objects
FOR INSERT WITH CHECK (
  bucket_id = 'catalogo' AND
  auth.role() = 'authenticated'
);

-- Política para permitir leitura pública de imagens do catálogo
CREATE POLICY "Permitir leitura pública de imagens do catálogo" ON storage.objects
FOR SELECT USING (bucket_id = 'catalogo');

-- Política para permitir atualização de imagens do catálogo
CREATE POLICY "Permitir atualização de imagens do catálogo" ON storage.objects
FOR UPDATE WITH CHECK (
  bucket_id = 'catalogo' AND
  auth.role() = 'authenticated'
);

-- Política para permitir exclusão de imagens do catálogo
CREATE POLICY "Permitir exclusão de imagens do catálogo" ON storage.objects
FOR DELETE USING (
  bucket_id = 'catalogo' AND
  auth.role() = 'authenticated'
);

-- =============================================
-- FUNÇÕES AUXILIARES PARA STORAGE
-- =============================================

-- Função para gerar URL pública de uma imagem
CREATE OR REPLACE FUNCTION get_public_url(bucket_name text, file_path text)
RETURNS text AS $$
BEGIN
  RETURN 'https://ydhzylfnpqlxnzfcclla.supabase.co/storage/v1/object/public/' || bucket_name || '/' || file_path;
END;
$$ LANGUAGE plpgsql;

-- Função para otimizar nome de arquivo
CREATE OR REPLACE FUNCTION generate_file_name(original_name text)
RETURNS text AS $$
DECLARE
  extension text;
  clean_name text;
  timestamp_str text;
BEGIN
  -- Extrair extensão
  extension := lower(substring(original_name from '\.([^.]*)$'));
  
  -- Limpar nome (remover caracteres especiais)
  clean_name := regexp_replace(lower(original_name), '[^a-z0-9.]', '_', 'g');
  
  -- Gerar timestamp
  timestamp_str := to_char(now(), 'YYYYMMDD_HH24MISS');
  
  -- Retornar nome otimizado
  RETURN timestamp_str || '_' || clean_name;
END;
$$ LANGUAGE plpgsql;
