/**
 * 日历主轴映射纯函数：把一条 booking 在主轴方向的连续区间 [startUnit, endUnit)
 * 按「精确比例 proportional」或「补全到刻度结束 snap」映射成 { offset, size }。
 * 单位无关：scalePerUnit 既可是 px（固定列宽视图）也可是 %（弹性列视图）。
 */

var EPS = 1e-9;
export function mapAxisSpan(axis, startUnit, endUnit, mode) {
  var s = startUnit - axis.originUnit;
  var e = Math.max(startUnit, endUnit) - axis.originUnit;
  if (mode === 'snap') {
    var t = axis.tickUnit > 0 ? axis.tickUnit : 1;
    s = Math.floor(s / t + EPS) * t;
    e = Math.ceil(e / t - EPS) * t;
    if (e <= s) e = s + t;
  }
  var offset = s * axis.scalePerUnit;
  var size = Math.max(axis.minSize, (e - s) * axis.scalePerUnit);
  return {
    offset: offset,
    size: size
  };
}

/**
 * 天维度：把（列下标, 当天浮点小时）折算成连续「天单位」坐标。
 * frac 限制在 [0,1]，使跨日首尾按当天营业小时占比收口。
 *
 * 营业窗口起点 `dayGridMin` 可能不是 0 点、甚至接近午夜（跨午夜营业，如 23:59 起）。
 * 此时 `hour - dayGridMin` 对白天小时会变负而被 clamp 成 0，导致所有预约挤到格子开头。
 * 因此先对 24h 做环绕，得到「距营业起点的正向偏移」，再按 span 归一化。
 */
export function dayGridUnit(colIndex, hour, dayGridMin, dayGridSpan) {
  if (dayGridSpan <= 0) return colIndex;
  var rel = (hour - dayGridMin) % 24;
  if (rel < 0) rel += 24;
  var frac = Math.min(1, Math.max(0, rel / dayGridSpan));
  return colIndex + frac;
}
var VIEW_DEFAULT_FILL_MODE = {
  day: 'proportional',
  week: 'snap',
  resource: 'snap',
  month: 'snap'
};
export function resolveTickFillMode(view, override) {
  return override !== null && override !== void 0 ? override : VIEW_DEFAULT_FILL_MODE[view];
}