import type { PageFormatId } from "@/lib/drive/page-formats"
import {
  formatRulerMajorLabel,
  getRulerUnitConfig,
} from "@/lib/drive/docs-ruler-units"

export type DocsRulerTick = {
  /** Position in page px. */
  pos: number
  major: boolean
  label?: string
}

function buildRulerTicksAlongAxis(
  lengthPx: number,
  formatId: PageFormatId,
  originOffsetPx = 0
): DocsRulerTick[] {
  const { unit, majorStepPx, minorDivisions } = getRulerUnitConfig(formatId)
  const minorStep = majorStepPx / minorDivisions
  const ticks: DocsRulerTick[] = []

  const startMajor = -Math.ceil(originOffsetPx / majorStepPx)
  const endMajor = Math.ceil(lengthPx / majorStepPx)

  for (let major = startMajor; major <= endMajor; major += 1) {
    const pos = major * majorStepPx
    if (pos > lengthPx + 0.5) break

    const unitValue = major
    ticks.push({
      pos,
      major: true,
      label:
        unitValue !== 0 || originOffsetPx > 0
          ? formatRulerMajorLabel(unitValue, unit)
          : undefined,
    })

    if (pos < 0) continue

    for (let minor = 1; minor < minorDivisions; minor += 1) {
      const tickPos = pos + minor * minorStep
      if (tickPos > lengthPx) break
      ticks.push({ pos: tickPos, major: false })
    }
  }

  return ticks
}

export function buildHorizontalRulerTicks(
  lengthPx: number,
  formatId: PageFormatId
): DocsRulerTick[] {
  return buildRulerTicksAlongAxis(lengthPx, formatId, 0)
}

export function buildVerticalRulerTicks(
  pageHeightPx: number,
  topMarginPx: number,
  formatId: PageFormatId
): DocsRulerTick[] {
  return buildRulerTicksAlongAxis(pageHeightPx, formatId, topMarginPx)
}
