"use server";

import { revalidatePath } from "next/cache";
import { headers } from "next/headers";
import { z } from "zod";

import { auth } from "@/lib/auth";
import { requireOrgMember } from "@/lib/auth-guards";
import { assertQuota } from "@/lib/billing/quotas";

const InviteSchema = z.object({
  email: z.email(),
  role: z.enum(["admin", "member"]),
});

export async function inviteMember(input: { email: string; role: "admin" | "member" }) {
  const { activeOrganizationId } = await requireOrgMember({ minRole: "admin" });
  const parsed = InviteSchema.parse(input);

  await assertQuota(activeOrganizationId, "seats");

  await auth.api.createInvitation({
    headers: await headers(),
    body: {
      organizationId: activeOrganizationId,
      email: parsed.email,
      role: parsed.role,
    },
  });
  revalidatePath("/settings/team");
}

const InvitationIdSchema = z.object({ invitationId: z.string().min(1) });

export async function revokeInvitation(input: { invitationId: string }) {
  await requireOrgMember({ minRole: "admin" });
  const { invitationId } = InvitationIdSchema.parse(input);

  await auth.api.cancelInvitation({
    headers: await headers(),
    body: { invitationId },
  });
  revalidatePath("/settings/team");
}

const MemberIdSchema = z.object({ memberId: z.string().min(1) });

export async function removeMember(input: { memberId: string }) {
  const { activeOrganizationId } = await requireOrgMember({ minRole: "admin" });
  const { memberId } = MemberIdSchema.parse(input);

  await auth.api.removeMember({
    headers: await headers(),
    body: { organizationId: activeOrganizationId, memberIdOrEmail: memberId },
  });
  revalidatePath("/settings/team");
}

const UpdateRoleSchema = z.object({
  memberId: z.string().min(1),
  role: z.enum(["admin", "member"]),
});

export async function updateMemberRole(input: { memberId: string; role: "admin" | "member" }) {
  const { activeOrganizationId } = await requireOrgMember({ minRole: "admin" });
  const parsed = UpdateRoleSchema.parse(input);

  await auth.api.updateMemberRole({
    headers: await headers(),
    body: {
      organizationId: activeOrganizationId,
      memberId: parsed.memberId,
      role: parsed.role,
    },
  });
  revalidatePath("/settings/team");
}
