'use server';

import { getServerSession } from 'next-auth/next';
import { authOptions } from '@/lib/auth';
import { usersService } from '@/services/users';
import { revalidatePath } from 'next/cache';
import { getGravatarUrl } from '@/lib/gravatar';

export async function updateProfile(formData: {
  name?: string;
  firstName?: string;
  lastName?: string;
  avatar?: string;
  useGravatar?: boolean;
}) {
  try {
    const session = await getServerSession(authOptions);

    if (!session?.user?.id) {
      return { success: false, error: 'Non authentifié' };
    }

    // Validation
    if (formData.firstName && formData.firstName.length > 50) {
      return {
        success: false,
        error: 'Le prénom ne peut pas dépasser 50 caractères',
      };
    }

    if (formData.lastName && formData.lastName.length > 50) {
      return {
        success: false,
        error: 'Le nom ne peut pas dépasser 50 caractères',
      };
    }

    if (formData.name && formData.name.length > 100) {
      return {
        success: false,
        error: "Le nom d'affichage ne peut pas dépasser 100 caractères",
      };
    }

    if (formData.avatar && formData.avatar.length > 500) {
      return {
        success: false,
        error: "L'URL de l'avatar ne peut pas dépasser 500 caractères",
      };
    }

    // Déterminer l'URL de l'avatar
    let finalAvatarUrl: string | null = null;

    if (formData.useGravatar) {
      // Utiliser Gravatar si demandé
      finalAvatarUrl = getGravatarUrl(session.user.email || '', { size: 200 });
    } else if (formData.avatar) {
      // Utiliser l'URL custom si fournie
      finalAvatarUrl = formData.avatar;
    } else {
      // Garder l'avatar actuel ou null
      const currentUser = await usersService.getUserById(session.user.id);
      finalAvatarUrl = currentUser?.avatar || null;
    }

    // Mettre à jour l'utilisateur
    const updatedUser = await usersService.updateUser(session.user.id, {
      name: formData.name || null,
      firstName: formData.firstName || null,
      lastName: formData.lastName || null,
      avatar: finalAvatarUrl,
    });

    // Revalider la page de profil
    revalidatePath('/profile');

    return {
      success: true,
      user: {
        id: updatedUser.id,
        email: updatedUser.email,
        name: updatedUser.name,
        firstName: updatedUser.firstName,
        lastName: updatedUser.lastName,
        avatar: updatedUser.avatar,
        role: updatedUser.role,
        createdAt: updatedUser.createdAt.toISOString(),
        lastLoginAt: updatedUser.lastLoginAt?.toISOString() || null,
      },
    };
  } catch (error) {
    console.error('Profile update error:', error);
    return { success: false, error: 'Erreur lors de la mise à jour du profil' };
  }
}

export async function getProfile() {
  try {
    const session = await getServerSession(authOptions);

    if (!session?.user?.id) {
      return { success: false, error: 'Non authentifié' };
    }

    const user = await usersService.getUserById(session.user.id);

    if (!user) {
      return { success: false, error: 'Utilisateur non trouvé' };
    }

    return {
      success: true,
      user: {
        id: user.id,
        email: user.email,
        name: user.name,
        firstName: user.firstName,
        lastName: user.lastName,
        avatar: user.avatar,
        role: user.role,
        createdAt: user.createdAt.toISOString(),
        lastLoginAt: user.lastLoginAt?.toISOString() || null,
      },
    };
  } catch (error) {
    console.error('Profile get error:', error);
    return {
      success: false,
      error: 'Erreur lors de la récupération du profil',
    };
  }
}

export async function applyGravatar() {
  try {
    const session = await getServerSession(authOptions);

    if (!session?.user?.id) {
      return { success: false, error: 'Non authentifié' };
    }

    if (!session.user?.email) {
      return { success: false, error: 'Email requis pour Gravatar' };
    }

    // Générer l'URL Gravatar
    const gravatarUrl = getGravatarUrl(session.user.email, { size: 200 });

    // Mettre à jour l'utilisateur
    const updatedUser = await usersService.updateUser(session.user.id, {
      avatar: gravatarUrl,
    });

    // Revalider la page de profil
    revalidatePath('/profile');

    return {
      success: true,
      user: {
        id: updatedUser.id,
        email: updatedUser.email,
        name: updatedUser.name,
        firstName: updatedUser.firstName,
        lastName: updatedUser.lastName,
        avatar: updatedUser.avatar,
        role: updatedUser.role,
        createdAt: updatedUser.createdAt.toISOString(),
        lastLoginAt: updatedUser.lastLoginAt?.toISOString() || null,
      },
    };
  } catch (error) {
    console.error('Gravatar update error:', error);
    return { success: false, error: 'Erreur lors de la mise à jour Gravatar' };
  }
}
