-- =====================================================================
-- SQL_FIX_user_trigger.sql
-- إصلاح خطأ "Database error creating new user"
-- شغّل المحتوى مرة وحدة في Supabase SQL Editor
-- =====================================================================

-- ============================================================
-- 1) أعد إنشاء الـ trigger function بالشكل الصحيح
--    - SET search_path: ضروري لإيجاد public.profiles
--    - EXCEPTION: حتى لو فشل إنشاء profile، إنشاء المستخدم ينجح
--    - SECURITY DEFINER: يتجاوز RLS
-- ============================================================
DROP TRIGGER IF EXISTS on_auth_user_created ON auth.users;
DROP FUNCTION IF EXISTS public.handle_new_user();

CREATE OR REPLACE FUNCTION public.handle_new_user()
RETURNS TRIGGER
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
BEGIN
  INSERT INTO public.profiles (id, full_name, email, role, permissions)
  VALUES (
    NEW.id,
    COALESCE(NEW.raw_user_meta_data->>'full_name', split_part(NEW.email, '@', 1)),
    NEW.email,
    'user',
    ARRAY[]::TEXT[]
  )
  ON CONFLICT (id) DO NOTHING;
  RETURN NEW;
EXCEPTION
  WHEN OTHERS THEN
    -- ✅ لو حصلت أي مشكلة، نسجّلها كتحذير بس ما نمنع إنشاء المستخدم
    RAISE WARNING 'handle_new_user failed: % (SQLSTATE: %)', SQLERRM, SQLSTATE;
    RETURN NEW;
END;
$$;

-- ✅ امنح صلاحية التنفيذ لكل الأدوار اللي ممكن تشغل الـ trigger
GRANT EXECUTE ON FUNCTION public.handle_new_user() TO postgres, service_role, authenticated, anon;

-- ✅ امنح صلاحية الـ INSERT المباشرة على profiles لـ service_role (يستخدمها auth admin)
GRANT INSERT, SELECT, UPDATE ON public.profiles TO postgres, service_role;

-- ✅ أعد إنشاء الـ trigger
CREATE TRIGGER on_auth_user_created
  AFTER INSERT ON auth.users
  FOR EACH ROW EXECUTE FUNCTION public.handle_new_user();


-- ============================================================
-- 2) اصلاح أي مستخدمين تم إنشاؤهم ومافي عندهم profile
--    (لو فشلت محاولات سابقة وبقي users بدون profiles)
-- ============================================================
INSERT INTO public.profiles (id, full_name, email, role, permissions)
SELECT
  u.id,
  COALESCE(u.raw_user_meta_data->>'full_name', split_part(u.email, '@', 1)),
  u.email,
  'user',
  ARRAY[]::TEXT[]
FROM auth.users u
LEFT JOIN public.profiles p ON p.id = u.id
WHERE p.id IS NULL
ON CONFLICT (id) DO NOTHING;


-- =====================================================================
-- ✅ بعد التشغيل: جرّب إنشاء المستخدم من Supabase Dashboard مرة ثانية.
--    لو ظهر خطأ ثاني، روح SQL Editor واكتب:
--      SELECT * FROM auth.users ORDER BY created_at DESC LIMIT 5;
--    وشوف إذا المستخدم انعمل أصلاً (ممكن الخطأ كان كاذب)
-- =====================================================================
