```ts
export function cheapestPassPlan(tripDays: number[], passes: { span: number; cost: number }[]): { total: number; purchases: number[][] } {
  if (tripDays.length === 0) return { total: 0, purchases: [] };

  tripDays.forEach(day => {
    if (!Number.isInteger(day) || day <= 0) throw new Error("Trip days must be positive integers.");
  });

  passes.forEach(pass => {
    if (!Number.isInteger(pass.span) || pass.span <= 0) throw new Error("Pass span must be a positive integer.");
    if (!Number.isInteger(pass.cost) || pass.cost < 0) throw new Error("Pass cost must be a non-negative integer.");
  });

  const sortedTripDays = [...tripDays].sort((a, b) => a - b);
  let totalCost = 0;
  let purchases: number[][] = [];
  let index = 0;

  passes.sort((a, b) => a.cost - b.cost);

  for (const pass of passes) {
    while (index < sortedTripDays.length) {
      const coveredUntil = sortedTripDays[index] + pass.span - 1;
      if (coveredUntil >= sortedTripDays[sortedTripDays.length - 1]) break;

      totalCost += pass.cost;
      purchases.push([sortedTripDays[index], pass.span]);
      index++;
    }
  }

  return { total: totalCost, purchases };
}
```