import { DomainError } from "../../shared/errors.ts";
import type { InventoryItem } from "./inventory.ts";
import { assertBuyerOrderAccess, assertSellerOrderAccess, type Order } from "../orders/orders.ts";

export function markInventoryFunded(item: InventoryItem, order: Order): InventoryItem {
  if (item.orderId !== order.id || item.status !== "reserved") throw new DomainError("INVALID_INVENTORY_TRANSITION", "Reserved inventory does not match this order.");
  if (order.status !== "funded") throw new DomainError("ORDER_NOT_FUNDED", "Verified funding is required before inventory can be sold.");
  return { ...item, status: "sold_funded", reservedUntil: undefined };
}

export function markInventoryDelivered(item: InventoryItem, order: Order): InventoryItem {
  if (item.orderId !== order.id || item.status !== "sold_funded") throw new DomainError("INVALID_INVENTORY_TRANSITION", "Funded inventory does not match this order.");
  if (order.status !== "funded") throw new DomainError("ORDER_NOT_FUNDED", "Order is not eligible for delivery.");
  return { ...item, status: "delivered" };
}

export function authorizeBuyerSecretRead(item: InventoryItem, order: Order, actorBuyerId: string): Uint8Array {
  assertBuyerOrderAccess(order, actorBuyerId);
  if (item.orderId !== order.id || !(["delivered", "completed"] as const).includes(item.status as "delivered" | "completed")) {
    throw new DomainError("DELIVERY_NOT_AVAILABLE", "Digital delivery is not available.");
  }
  return item.secretCiphertext;
}

export function assertSellerMayManageDelivery(order: Order, actorSellerId: string): void {
  assertSellerOrderAccess(order, actorSellerId);
  if (!(["funded", "delivered"] as const).includes(order.status as "funded" | "delivered")) {
    throw new DomainError("DELIVERY_NOT_ACTIONABLE", "This order is not actionable.");
  }
}
