import { createContext, useContext, useState, useEffect } from 'react'
import { account, databases, DATABASE_ID, COLLECTIONS, ID, Query } from '../lib/appwrite'

const AuthContext = createContext()

// Demo mode when Appwrite is not configured
const DEMO_MODE = !import.meta.env.VITE_APPWRITE_PROJECT_ID

// Hilfsfunktion: Fügt User automatisch zur employees Collection hinzu
async function ensureEmployeeExists(user) {
  if (!user || DEMO_MODE) return
  
  try {
    // Prüfe ob User bereits in employees Collection existiert
    const response = await databases.listDocuments(
      DATABASE_ID,
      COLLECTIONS.EMPLOYEES,
      [Query.equal('userId', user.$id)]
    )
    
    // Wenn User noch nicht existiert, füge ihn hinzu
    if (response.documents.length === 0) {
      await databases.createDocument(
        DATABASE_ID,
        COLLECTIONS.EMPLOYEES,
        ID.unique(),
        {
          userId: user.$id,
          displayName: user.name || user.email,
          email: user.email,
          shortcode: '' // Kürzel wird später vom Admin hinzugefügt
        }
      )
      console.log('✅ User automatisch zur Mitarbeiter-Liste hinzugefügt')
    }
  } catch (error) {
    // Fehler ignorieren wenn Collection nicht existiert oder Permissions fehlen
    if (error.code !== 404) {
      console.warn('Could not add user to employees collection:', error.message)
    }
  }
}

export function AuthProvider({ children }) {
  const [user, setUser] = useState(null)
  const [loading, setLoading] = useState(true)

  useEffect(() => {
    checkUser()
  }, [])

  async function checkUser() {
    if (DEMO_MODE) {
      // Check localStorage for demo session
      const demoUser = localStorage.getItem('demo_user')
      if (demoUser) {
        setUser(JSON.parse(demoUser))
      }
      setLoading(false)
      return
    }
    
    try {
      const session = await account.get()
      setUser(session)
      // Automatisch zur employees Collection hinzufügen
      await ensureEmployeeExists(session)
    } catch (error) {
      // Kein Fehler loggen beim initialen Check - das ist normal wenn nicht eingeloggt
      // Nur loggen wenn es ein unerwarteter Fehler ist (nicht 401)
      if (error.code !== 401 && error.code !== 404) {
        console.error('Unexpected error checking user:', error)
      }
      setUser(null)
    } finally {
      setLoading(false)
    }
  }

  async function login(email, password) {
    if (DEMO_MODE) {
      // Demo login - accept any credentials
      const demoUser = { $id: 'demo', email, name: email.split('@')[0] }
      localStorage.setItem('demo_user', JSON.stringify(demoUser))
      setUser(demoUser)
      return { success: true }
    }
    
    try {
      // Appwrite 1.5.7 / SDK 13.0 - versuche beide Methoden für Kompatibilität
      try {
        await account.createEmailSession(email, password)
      } catch (e) {
        // Fallback für ältere API
        if (account.createEmailPasswordSession) {
          await account.createEmailPasswordSession(email, password)
        } else {
          throw e
        }
      }
      
      // User-Daten laden und automatisch zur employees Collection hinzufügen
      const session = await account.get()
      setUser(session)
      await ensureEmployeeExists(session)
      
      return { success: true }
    } catch (error) {
      console.error('Login error:', error)
      let errorMessage = error.message || 'Login fehlgeschlagen'
      
      // Bessere Fehlermeldungen
      if (error.code === 401 || errorMessage.includes('Invalid credentials')) {
        errorMessage = 'Ungültige Email oder Passwort'
      } else if (errorMessage.includes('User not found')) {
        errorMessage = 'Benutzer nicht gefunden. Bitte registriere dich zuerst.'
      } else if (errorMessage.includes('Email/Password')) {
        errorMessage = 'Email/Password Authentifizierung ist nicht aktiviert. Bitte aktiviere sie in deinem Appwrite Dashboard unter Auth → Providers.'
      }
      
      return { success: false, error: errorMessage }
    }
  }

  async function logout() {
    if (DEMO_MODE) {
      localStorage.removeItem('demo_user')
      setUser(null)
      return
    }
    
    try {
      await account.deleteSession('current')
      setUser(null)
    } catch (error) {
      console.error('Logout error:', error)
    }
  }

  async function register(email, password, name) {
    if (DEMO_MODE) {
      return login(email, password)
    }
    
    try {
      // Appwrite SDK 13.0 verwendet ID.unique() für die User ID
      await account.create(ID.unique(), email, password, name)
      // Login ruft automatisch ensureEmployeeExists auf
      await login(email, password)
      return { success: true }
    } catch (error) {
      console.error('Register error:', error)
      let errorMessage = error.message || 'Registrierung fehlgeschlagen'
      
      // Bessere Fehlermeldungen
      if (errorMessage.includes('already exists') || errorMessage.includes('duplicate')) {
        errorMessage = 'Ein Benutzer mit dieser Email existiert bereits. Bitte logge dich ein.'
      } else if (errorMessage.includes('Email/Password')) {
        errorMessage = 'Email/Password Authentifizierung ist nicht aktiviert. Bitte aktiviere sie in deinem Appwrite Dashboard unter Auth → Providers.'
      } else if (errorMessage.includes('password') && errorMessage.includes('length')) {
        errorMessage = 'Das Passwort muss mindestens 8 Zeichen lang sein.'
      }
      
      return { success: false, error: errorMessage }
    }
  }

  // Hilfsfunktion um zu prüfen ob Benutzer Admin ist
  const isAdmin = () => {
    if (!user) return false
    // Prüfe ob Benutzer das "admin" Label hat
    return user.labels?.includes('admin') || false
  }

  const value = {
    user,
    loading,
    login,
    logout,
    register,
    isAdmin: isAdmin()
  }

  return (
    <AuthContext.Provider value={value}>
      {children}
    </AuthContext.Provider>
  )
}

export function useAuth() {
  return useContext(AuthContext)
}
