ALTER TABLE public.perfis ADD COLUMN IF NOT EXISTS nome text;

UPDATE public.perfis SET nome = split_part(email, '@', 1) WHERE nome IS NULL;

ALTER TABLE public.perfis ALTER COLUMN nome SET NOT NULL;

CREATE UNIQUE INDEX IF NOT EXISTS perfis_nome_unico ON public.perfis (lower(nome));

CREATE OR REPLACE FUNCTION public.registrar_perfil()
 RETURNS perfis
 LANGUAGE plpgsql
 SECURITY DEFINER
 SET search_path TO 'public'
AS $function$
DECLARE
  v_uid uuid := auth.uid();
  v_email text;
  v_nome text;
  v_primeiro boolean;
  v_perfil public.perfis;
BEGIN
  IF v_uid IS NULL THEN
    RAISE EXCEPTION 'Nao autenticado';
  END IF;

  SELECT * INTO v_perfil FROM public.perfis WHERE id = v_uid;
  IF FOUND THEN
    RETURN v_perfil;
  END IF;

  SELECT email INTO v_email FROM auth.users WHERE id = v_uid;
  v_nome := split_part(coalesce(v_email, ''), '@', 1);
  SELECT NOT EXISTS (SELECT 1 FROM public.perfis) INTO v_primeiro;

  INSERT INTO public.perfis (id, email, nome, aprovado)
  VALUES (v_uid, coalesce(v_email, ''), v_nome, v_primeiro)
  RETURNING * INTO v_perfil;

  IF v_primeiro THEN
    INSERT INTO public.papeis_usuario (user_id, role) VALUES (v_uid, 'admin')
    ON CONFLICT DO NOTHING;
  END IF;

  RETURN v_perfil;
END;
$function$;