"use server";

import { revalidatePath } from "next/cache";
import { auth } from "@/lib/auth";
import { challengeService } from "@/services/challenges/challenge.service";
import {
  ValidationError,
  NotFoundError,
  ConflictError,
} from "@/services/errors";

export async function createChallenge(data: {
  challengedId: string;
  title: string;
  description: string;
  pointsReward?: number;
}) {
  try {
    const session = await auth();

    if (!session?.user?.id) {
      return {
        success: false,
        error: "Vous devez être connecté pour créer un défi",
      };
    }

    const challenge = await challengeService.createChallenge({
      challengerId: session.user.id,
      challengedId: data.challengedId,
      title: data.title,
      description: data.description,
      pointsReward: data.pointsReward || 100,
    });

    revalidatePath("/challenges");
    revalidatePath("/profile");

    return { success: true, message: "Défi créé avec succès", data: challenge };
  } catch (error) {
    console.error("Create challenge error:", error);

    if (error instanceof ValidationError || error instanceof ConflictError) {
      return { success: false, error: error.message };
    }
    if (error instanceof NotFoundError) {
      return { success: false, error: error.message };
    }

    return {
      success: false,
      error: "Une erreur est survenue lors de la création du défi",
    };
  }
}

export async function acceptChallenge(challengeId: string) {
  try {
    const session = await auth();

    if (!session?.user?.id) {
      return {
        success: false,
        error: "Vous devez être connecté pour accepter un défi",
      };
    }

    const challenge = await challengeService.acceptChallenge(
      challengeId,
      session.user.id
    );

    revalidatePath("/challenges");
    revalidatePath("/profile");

    return { success: true, message: "Défi accepté", data: challenge };
  } catch (error) {
    console.error("Accept challenge error:", error);

    if (error instanceof ValidationError) {
      return { success: false, error: error.message };
    }
    if (error instanceof NotFoundError) {
      return { success: false, error: error.message };
    }

    return {
      success: false,
      error: "Une erreur est survenue lors de l'acceptation du défi",
    };
  }
}

export async function cancelChallenge(challengeId: string) {
  try {
    const session = await auth();

    if (!session?.user?.id) {
      return {
        success: false,
        error: "Vous devez être connecté pour annuler un défi",
      };
    }

    const challenge = await challengeService.cancelChallenge(
      challengeId,
      session.user.id
    );

    revalidatePath("/challenges");
    revalidatePath("/profile");

    return { success: true, message: "Défi annulé", data: challenge };
  } catch (error) {
    console.error("Cancel challenge error:", error);

    if (error instanceof ValidationError) {
      return { success: false, error: error.message };
    }
    if (error instanceof NotFoundError) {
      return { success: false, error: error.message };
    }

    return {
      success: false,
      error: "Une erreur est survenue lors de l'annulation du défi",
    };
  }
}
