"use server";

import { revalidatePath } from "next/cache";
import { requireAuth } from "@/lib/auth/guard";
import {
  registerAgency,
  updateAgencyProfile,
  inviteAgentToAgency,
  removeAgentFromAgency,
  resendAgencyInvitation,
  revokeAgencyInvitation,
  acceptAgencyInvitation,
  updateAgencyMemberRole,
} from "@/lib/services/agency.service";
import {
  createAgencySchema,
  updateAgencySchema,
  inviteAgentSchema,
  CreateAgencyInput,
  UpdateAgencyInput,
  InviteAgentInput,
} from "@/lib/validation/agency.schema";
import { AgencyMemberRole } from "@/types/database";

export async function createAgencyAction(input: CreateAgencyInput) {
  try {
    const user = await requireAuth();
    const validated = createAgencySchema.parse(input);

    const result = await registerAgency(user, validated);
    if (!result.success) {
      return { success: false, error: result.error };
    }

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

export async function updateAgencyAction(agencyId: string, input: UpdateAgencyInput) {
  try {
    const user = await requireAuth();
    const validated = updateAgencySchema.parse(input);

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

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

export async function inviteAgentAction(input: InviteAgentInput) {
  try {
    const user = await requireAuth();
    const validated = inviteAgentSchema.parse(input);

    const result = await inviteAgentToAgency(
      user,
      validated.agencyId,
      validated.email,
      validated.role
    );

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

    revalidatePath("/dashboard/agency");
    return { success: true };
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Failed to invite agent";
    return { success: false, error: message };
  }
}

export async function resendInvitationAction(invitationId: string) {
  try {
    const user = await requireAuth();
    const result = await resendAgencyInvitation(user, invitationId);

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

    revalidatePath("/dashboard/agency");
    return { success: true };
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Failed to resend invitation";
    return { success: false, error: message };
  }
}

export async function revokeInvitationAction(invitationId: string) {
  try {
    const user = await requireAuth();
    const result = await revokeAgencyInvitation(user, invitationId);

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

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

export async function acceptInvitationAction(token: string) {
  try {
    const user = await requireAuth();
    const result = await acceptAgencyInvitation(user, token);

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

    revalidatePath("/dashboard");
    revalidatePath("/dashboard/agency");
    revalidatePath("/dashboard/properties/new");
    return { success: true, agencyName: result.agencyName };
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Failed to accept invitation";
    return { success: false, error: message };
  }
}

export async function updateMemberRoleAction(
  agencyId: string,
  memberUserId: string,
  newRole: AgencyMemberRole
) {
  try {
    const user = await requireAuth();
    const result = await updateAgencyMemberRole(user, agencyId, memberUserId, newRole);

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

    revalidatePath("/dashboard/agency");
    return { success: true };
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Failed to update member role";
    return { success: false, error: message };
  }
}

export async function removeAgentAction(agencyId: string, memberUserId: string) {
  try {
    const user = await requireAuth();
    const result = await removeAgentFromAgency(user, agencyId, memberUserId);

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

    revalidatePath("/dashboard/agency");
    return { success: true };
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : "Failed to remove agent";
    return { success: false, error: message };
  }
}
