import "server-only";

import {
  assertManagedMemberCreationAllowedByOwnerEmail,
  createManagedMemberByOwnerEmail,
} from "@/lib/mail-automation";
import { hasComplimentaryGrowthPlanByEmail } from "@/lib/mail-billing";
import {
  requestManagedMemberSeatChargeByOwnerEmail,
  refundTossPayChargeById,
} from "@/lib/toss-pay";

type CreateManagedMemberInput = {
  displayName: string;
  localPart: string;
  password: string;
};

export async function createManagedMemberWithImmediateChargeByOwnerEmail(
  ownerEmail: string,
  input: CreateManagedMemberInput,
) {
  await assertManagedMemberCreationAllowedByOwnerEmail(ownerEmail, input);

  if (hasComplimentaryGrowthPlanByEmail(ownerEmail)) {
    await createManagedMemberByOwnerEmail(ownerEmail, input);

    return {
      status: "complimentary" as const,
    };
  }

  const charge = await requestManagedMemberSeatChargeByOwnerEmail({
    displayName: input.displayName,
    email: ownerEmail,
    localPart: input.localPart,
  });

  if (charge.status !== "success") {
    throw new Error("member-charge-failed");
  }

  try {
    await createManagedMemberByOwnerEmail(ownerEmail, input);
  } catch {
    try {
      await refundTossPayChargeById({
        chargeId: charge.chargeId,
        reason: "멤버 추가 실패 자동 환불",
        requestedByEmail: ownerEmail,
      });
    } catch {
      throw new Error("member-charge-refund-failed");
    }

    throw new Error("member-create-refunded");
  }

  return charge;
}
