-- ============================================
-- 自动创建 ak_users 记录的触发器
-- ============================================
-- 位置：pages/user/test/USER_AUTH_TRIGGER.sql
-- 用途：当 auth.users 表中创建新用户时，自动在 ak_users 表中创建对应的业务资料记录
-- 
-- 执行方式：
--   在 Supabase Dashboard 的 SQL Editor 中执行此文件
--   需要 superuser 权限（Dashboard 默认有）
-- ============================================

-- 触发器函数 `public.handle_new_user()` 的定义在 `USER_AUTH_SCHEMA.sql` 中完成。
-- 这里仅负责在 auth.users 上创建触发器（避免重复定义函数导致版本不一致）。

-- 兼容处理：如果 `public.handle_new_user()` 尚未创建（例如先执行了本文件），则在此处补齐创建。
-- 说明：这里采用“存在则跳过”的创建方式，不会覆盖已有实现。
DO $$
BEGIN
  IF NOT EXISTS (
    SELECT 1
    FROM pg_proc p
    JOIN pg_namespace n ON n.oid = p.pronamespace
    WHERE n.nspname = 'public'
      AND p.proname = 'handle_new_user'
  ) THEN
    EXECUTE $fn$
      CREATE FUNCTION public.handle_new_user()
      RETURNS TRIGGER
      LANGUAGE plpgsql
      SECURITY DEFINER
      SET search_path = public
      AS $body$
      BEGIN
        BEGIN
          INSERT INTO public.ak_users (id, email, username)
          VALUES (
            NEW.id,
            NEW.email,
            COALESCE(SPLIT_PART(NEW.email, '@', 1), 'user')
          )
          ON CONFLICT (id) DO NOTHING;
        EXCEPTION WHEN OTHERS THEN
          RAISE WARNING 'handle_new_user failed: %', SQLERRM;
        END;

        RETURN NEW;
      END;
      $body$;
    $fn$;
  END IF;
END $$;

-- 在 auth.users 表上创建触发器
-- 注意：这个触发器会在每次 auth.users 插入新记录时自动执行
DO $$
BEGIN
  IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'on_auth_user_created') THEN
    EXECUTE 'CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION public.handle_new_user()';
  END IF;
END $$;

-- ============================================
-- 验证触发器
-- ============================================
-- 执行以下查询验证触发器是否创建成功：
-- SELECT * FROM pg_trigger WHERE tgname = 'on_auth_user_created';
-- SELECT * FROM pg_proc WHERE proname = 'handle_new_user';

-- ============================================
-- 测试触发器（可选）
-- ============================================
-- 注意：以下测试代码会创建一个测试用户，执行前请确认
-- 
-- 1. 通过 Supabase Auth API 注册一个新用户
-- 2. 检查 ak_users 表中是否自动创建了对应的记录
-- 
-- 或者手动测试（需要 admin 权限）：
-- INSERT INTO auth.users (id, email, encrypted_password, email_confirmed_at, created_at, updated_at)
-- VALUES (
--   gen_random_uuid(),
--   'test@example.com',
--   crypt('password', gen_salt('bf')),
--   NOW(),
--   NOW(),
--   NOW()
-- );
-- 
-- 然后检查 ak_users 表：
-- SELECT * FROM ak_users WHERE email = 'test@example.com';
