"use server";

import { revalidatePath } from "next/cache";
import { requireAuth } from "@/lib/auth/guard";
import {
  approvePropertySchema,
  rejectPropertySchema,
  verifyAgencySchema,
  ApprovePropertyInput,
  RejectPropertyInput,
  VerifyAgencyInput,
} from "@/lib/validation/moderation.schema";
import {
  approveProperty,
  rejectProperty,
  verifyAgencyCorporateStatus,
} from "@/lib/services/moderation.service";
import {
  listAgenciesForVerification,
  getAgencyVerificationMetrics,
  revokeAgencyCorporateStatus,
} from "@/lib/services/agency.service";

export async function approvePropertyAction(input: ApprovePropertyInput) {
  try {
    const user = await requireAuth();
    const isAuthorized =
      user.roles.includes("SUPER_ADMIN") ||
      user.roles.includes("EMPLOYEE") ||
      user.permissions.includes("property:approve_reject");

    if (!isAuthorized) {
      return { success: false, error: "Unauthorized: Moderation rights required" };
    }

    const validated = approvePropertySchema.parse(input);
    const result = await approveProperty(user, validated.propertyId, validated.notes);

    if (!result.success) {
      return { success: false, error: result.error };
    }

    revalidatePath("/admin");
    revalidatePath("/admin/properties");
    revalidatePath("/dashboard");
    revalidatePath("/dashboard/properties");
    revalidatePath("/properties");
    revalidatePath("/");
    return { success: true, property: result.property };
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Failed to approve property";
    return { success: false, error: message };
  }
}

export async function rejectPropertyAction(input: RejectPropertyInput) {
  try {
    const user = await requireAuth();
    const isAuthorized =
      user.roles.includes("SUPER_ADMIN") ||
      user.roles.includes("EMPLOYEE") ||
      user.permissions.includes("property:approve_reject");

    if (!isAuthorized) {
      return { success: false, error: "Unauthorized: Moderation rights required" };
    }

    const validated = rejectPropertySchema.parse(input);
    const result = await rejectProperty(user, validated.propertyId, validated.rejectionReason);

    if (!result.success) {
      return { success: false, error: result.error };
    }

    revalidatePath("/admin");
    revalidatePath("/admin/properties");
    revalidatePath("/dashboard");
    revalidatePath("/dashboard/properties");
    revalidatePath("/properties");
    revalidatePath("/");
    return { success: true, property: result.property };
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Failed to reject property";
    return { success: false, error: message };
  }
}

export async function verifyAgencyAction(input: VerifyAgencyInput) {
  try {
    const user = await requireAuth();
    const isAuthorized =
      user.roles.includes("SUPER_ADMIN") ||
      user.roles.includes("EMPLOYEE") ||
      user.permissions.includes("agency:verify");

    if (!isAuthorized) {
      return { success: false, error: "Unauthorized: Agency verification permission required" };
    }

    const validated = verifyAgencySchema.parse(input);
    const result = await verifyAgencyCorporateStatus(user, validated.agencyId);

    if (!result.success) {
      return { success: false, error: result.error };
    }

    revalidatePath("/admin/properties");
    revalidatePath("/admin/agency-verifications");
    revalidatePath("/agencies");
    revalidatePath("/dashboard");
    revalidatePath("/dashboard/agency");
    revalidatePath("/dashboard/billing");
    return { success: true };
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Failed to verify agency";
    return { success: false, error: message };
  }
}

export async function listAgenciesForVerificationAction(filters?: {
  status?: "ALL" | "PENDING" | "VERIFIED";
  search?: string;
}) {
  try {
    const user = await requireAuth();
    const res = await listAgenciesForVerification(user, filters);
    return { success: true, data: res };
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Failed to list agencies";
    return { success: false, error: message };
  }
}

export async function getAgencyVerificationMetricsAction() {
  try {
    const user = await requireAuth();
    const metrics = await getAgencyVerificationMetrics(user);
    return { success: true, metrics };
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Failed to get metrics";
    return { success: false, error: message };
  }
}

export async function revokeAgencyAction(input: { agencyId: string; reason?: string }) {
  try {
    const user = await requireAuth();
    const isAuthorized =
      user.roles.includes("SUPER_ADMIN") ||
      user.roles.includes("EMPLOYEE") ||
      user.permissions.includes("agency:verify");

    if (!isAuthorized) {
      return { success: false, error: "Unauthorized: Agency verification permission required" };
    }

    const result = await revokeAgencyCorporateStatus(user, input.agencyId, input.reason);
    if (!result.success) {
      return { success: false, error: result.error };
    }

    revalidatePath("/admin/agency-verifications");
    revalidatePath("/agencies");
    return { success: true };
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Failed to revoke agency verification";
    return { success: false, error: message };
  }
}
