import { branches, inventory, scooters, type InventoryItem, type Scooter } from "./mock-data";

export enum InventoryStatus {
  IN_STOCK = "IN_STOCK",
  LIMITED_STOCK = "LIMITED_STOCK",
  OUT_OF_STOCK = "OUT_OF_STOCK",
  TEST_RIDE_ONLY = "TEST_RIDE_ONLY",
  COMING_SOON = "COMING_SOON",
}

export type BranchAvailability = InventoryItem & {
  branch: (typeof branches)[number];
};

export function getInventoryByScooter(slug: string): BranchAvailability[] {
  const scooter = scooters.find((item) => item.slug === slug);

  if (!scooter) {
    return [];
  }

  return getBranchAvailabilityForScooter(scooter.id);
}

export function getScootersByBranch(branchSlug: string): Scooter[] {
  const branch = branches.find((item) => item.slug === branchSlug);

  if (!branch) {
    return [];
  }

  const availableScooterIds = new Set(
    inventory
      .filter(
        (item) =>
          item.branchId === branch.id &&
          item.status !== InventoryStatus.OUT_OF_STOCK &&
          item.status !== InventoryStatus.COMING_SOON,
      )
      .map((item) => item.scooterId),
  );

  return scooters.filter((scooter) => availableScooterIds.has(scooter.id));
}

export function getBranchAvailabilityForScooter(
  scooterId: string,
): BranchAvailability[] {
  return inventory
    .filter((item) => item.scooterId === scooterId)
    .map((item) => {
      const branch = branches.find((branchItem) => branchItem.id === item.branchId);

      if (!branch) {
        throw new Error(`Missing branch for inventory item: ${item.id}`);
      }

      return {
        ...item,
        branch,
      };
    });
}
