"use server";

import { revalidatePath } from "next/cache";
import { getCurrentUser } from "@/lib/auth/user";
import {
  createReview,
  replyToReview,
  voteReviewHelpful,
  moderateReview,
  getReviewsForTarget,
  getRatingSummary,
} from "@/lib/services/rating.service";
import {
  CreateReviewInput,
  AgentReviewReplyInput,
  ModerateReviewInput,
} from "@/lib/validation/review.schema";

export async function createReviewAction(input: CreateReviewInput) {
  try {
    const user = await getCurrentUser();
    if (!user) {
      return { success: false, error: "Please sign in to submit a review", requiresAuth: true };
    }

    const review = await createReview(user, input);

    if (input.targetType === "AGENT") {
      revalidatePath(`/agents/${input.targetId}`);
    } else if (input.targetType === "AGENCY") {
      revalidatePath(`/agencies/${input.targetId}`);
    }
    if (input.propertyId) {
      revalidatePath(`/properties/${input.propertyId}`);
    }
    revalidatePath("/dashboard/reviews");

    return { success: true, review };
  } catch (err: any) {
    return { success: false, error: err.message || "Failed to submit review" };
  }
}

export async function replyToReviewAction(input: AgentReviewReplyInput) {
  try {
    const user = await getCurrentUser();
    if (!user) {
      return { success: false, error: "Please sign in to post an official reply", requiresAuth: true };
    }

    const review = await replyToReview(user, input);
    revalidatePath(`/agents/${review.target_id}`);
    revalidatePath("/dashboard/reviews");
    return { success: true, review };
  } catch (err: any) {
    return { success: false, error: err.message || "Failed to post agent reply" };
  }
}

export async function voteReviewHelpfulAction(reviewId: string) {
  try {
    const user = await getCurrentUser();
    if (!user) {
      return { success: false, error: "Please sign in to vote", requiresAuth: true };
    }

    const res = await voteReviewHelpful(user, reviewId);
    return { success: true, ...res };
  } catch (err: any) {
    return { success: false, error: err.message || "Failed to register vote" };
  }
}

export async function moderateReviewAction(input: ModerateReviewInput) {
  try {
    const user = await getCurrentUser();
    if (!user) {
      return { success: false, error: "Unauthorized", requiresAuth: true };
    }

    await moderateReview(user, input);
    revalidatePath("/admin/reviews");
    revalidatePath("/dashboard/reviews");
    return { success: true };
  } catch (err: any) {
    return { success: false, error: err.message || "Failed to moderate review" };
  }
}

export async function getReviewsAction(
  targetType: "AGENT" | "AGENCY" | "PROPERTY",
  targetId: string,
  options?: { sortBy?: "NEWEST" | "HIGHEST_RATING" | "LOWEST_RATING" | "MOST_HELPFUL"; limit?: number; offset?: number }
) {
  try {
    const res = await getReviewsForTarget(targetType, targetId, options);
    return { success: true, ...res };
  } catch (err: any) {
    return { success: false, reviews: [], total: 0, error: err.message };
  }
}

export async function getRatingSummaryAction(
  targetType: "AGENT" | "AGENCY" | "PROPERTY",
  targetId: string
) {
  try {
    const summary = await getRatingSummary(targetType, targetId);
    return { success: true, summary };
  } catch (err: any) {
    return { success: false, summary: null, error: err.message };
  }
}
