import type { MapProjection } from "../geometry/mapProjection";
import type { MapLine } from "../model/mapTypes";

const TRACK_STYLE = { stroke: "rgba(104, 195, 189, 0.76)", width: 1.2 };
// Сброс — толстая линия поверх трассы, на отрезке от начала до конца сеанса.
// Цвет приглушённо-малиновый: отдельный тёплый оттенок, контрастный к бирюзовым
// виткам трассы (не теряется среди них) и не совпадающий с цветами заявок/маршрутов,
// но без кричащей яркости, чтобы не мешать просмотру контуров съёмки.
const DROP_STYLE = { stroke: "rgba(214, 96, 138, 0.82)", width: 5 };

export function drawTracks(ctx: CanvasRenderingContext2D, lines: MapLine[], projection: MapProjection) {
  ctx.save();
  ctx.lineCap = "round";
  ctx.lineJoin = "round";

  const wrapThreshold = projection.worldSize / 2;
  // Сбросы рисуем после трасс, чтобы их яркая линия легла поверх.
  const ordered = [...lines].sort((a, b) => Number(a.kind === "drop") - Number(b.kind === "drop"));
  for (const line of ordered) {
    if (line.points.length < 2) continue;
    const style = line.kind === "drop" ? DROP_STYLE : TRACK_STYLE;
    ctx.strokeStyle = style.stroke;
    ctx.lineWidth = style.width;
    ctx.beginPath();
    let prevX: number | undefined;
    for (const point of line.points) {
      const screen = projection.project(point);
      if (prevX === undefined || Math.abs(screen.x - prevX) > wrapThreshold) {
        ctx.moveTo(screen.x, screen.y);
      } else {
        ctx.lineTo(screen.x, screen.y);
      }
      prevX = screen.x;
    }
    ctx.stroke();
  }

  ctx.restore();
}
