-- ERWEITERTE BENUTZER TABELLE FÜR SUPABASE
-- Führen Sie dieses Script im Supabase SQL Editor aus

-- 1. Tabelle für erweiterte Benutzerinformationen erstellen
CREATE TABLE IF NOT EXISTS public.users (
  id UUID REFERENCES auth.users(id) ON DELETE CASCADE PRIMARY KEY,
  email TEXT NOT NULL,
  display_name TEXT,
  user_group TEXT DEFAULT 'Benutzer' CHECK (user_group IN ('Admin', 'Trainer', 'Benutzer')),
  last_login TIMESTAMP WITH TIME ZONE,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- 2. Row Level Security (RLS) aktivieren
ALTER TABLE public.users ENABLE ROW LEVEL SECURITY;

-- 3. RLS Policies erstellen (vereinfacht für Demo-Zwecke)

-- Policy: Benutzer können ihre eigenen Daten lesen
CREATE POLICY "Users can read own data" ON public.users
  FOR SELECT USING (auth.uid() = id);

-- Policy: Admins können alle Daten lesen
CREATE POLICY "Admins can read all data" ON public.users
  FOR SELECT USING (
    EXISTS (
      SELECT 1 FROM public.users 
      WHERE id = auth.uid() AND user_group = 'Admin'
    )
  );

-- Policy: Authentifizierte Benutzer können Updates durchführen (vereinfacht)
CREATE POLICY "Authenticated users can update" ON public.users
  FOR UPDATE USING (auth.uid() = id);

-- Policy: Neue Benutzer können sich selbst eintragen
CREATE POLICY "Users can insert own data" ON public.users
  FOR INSERT WITH CHECK (auth.uid() = id);

-- Policy: Authentifizierte Benutzer können löschen (wird über App-Logik kontrolliert)
CREATE POLICY "Authenticated users can delete" ON public.users
  FOR DELETE USING (auth.role() = 'authenticated');

-- 4. Funktionen erstellen

-- Funktion zum automatischen Update des updated_at Feldes
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
  NEW.updated_at = NOW();
  RETURN NEW;
END;
$$ language 'plpgsql';

-- Trigger für automatisches Update von updated_at
DROP TRIGGER IF EXISTS update_users_updated_at ON public.users;
CREATE TRIGGER update_users_updated_at 
  BEFORE UPDATE ON public.users 
  FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();

-- Funktion zum automatischen Erstellen eines Benutzereintrags bei Registrierung
CREATE OR REPLACE FUNCTION handle_new_user()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO public.users (id, email, display_name, user_group, last_login)
  VALUES (
    NEW.id,
    NEW.email,
    COALESCE(NEW.raw_user_meta_data->>'display_name', NEW.raw_user_meta_data->>'full_name'),
    'Benutzer',
    NOW()
  );
  RETURN NEW;
END;
$$ language 'plpgsql' SECURITY DEFINER;

-- Trigger für automatische Benutzererstellung
DROP TRIGGER IF EXISTS on_auth_user_created ON auth.users;
CREATE TRIGGER on_auth_user_created
  AFTER INSERT ON auth.users
  FOR EACH ROW EXECUTE FUNCTION handle_new_user();

-- 5. Indizes für bessere Performance
CREATE INDEX IF NOT EXISTS idx_users_email ON public.users(email);
CREATE INDEX IF NOT EXISTS idx_users_user_group ON public.users(user_group);
CREATE INDEX IF NOT EXISTS idx_users_last_login ON public.users(last_login);

-- 6. Bestehende Benutzer aus auth.users migrieren (falls vorhanden)
INSERT INTO public.users (id, email, display_name, user_group, created_at, last_login)
SELECT 
  id, 
  email, 
  COALESCE(raw_user_meta_data->>'display_name', raw_user_meta_data->>'full_name'),
  'Benutzer',
  created_at,
  NOW()
FROM auth.users
ON CONFLICT (id) DO NOTHING;

-- 7. Ersten Admin-Benutzer erstellen
-- WICHTIG: Ersetzen Sie 'ihre-admin@email.com' mit Ihrer eigenen E-Mail-Adresse
-- Entfernen Sie die Kommentare (--) vor den folgenden Zeilen und setzen Sie Ihre E-Mail ein:

-- UPDATE public.users 
-- SET user_group = 'Admin' 
-- WHERE email = 'ihre-admin@email.com';

-- ODER falls der Benutzer noch nicht existiert:
-- INSERT INTO public.users (id, email, display_name, user_group, created_at, last_login)
-- SELECT id, email, raw_user_meta_data->>'display_name', 'Admin', created_at, NOW()
-- FROM auth.users 
-- WHERE email = 'ihre-admin@email.com'
-- ON CONFLICT (id) DO UPDATE SET user_group = 'Admin';

-- Fertig! Die users Tabelle ist jetzt bereit.
