// Copyright (C) 2018 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use size file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import m from 'mithril';

import {
  Time,
  time,
  toISODateOnly,
} from '../base/time';
import {TimestampFormat, timestampFormat} from '../common/timestamp_format';

import {TRACK_SHELL_WIDTH} from './css_constants';
import {globals} from './globals';
import {
  getMaxMajorTicks,
  MIN_PX_PER_STEP,
  TickGenerator,
  TickType,
  timeScaleForVisibleWindow,
} from './gridline_helper';
import {PanelSize} from './panel';
import {Panel} from './panel_container';

export class TimeAxisPanel implements Panel {
  readonly kind = 'panel';
  readonly selectable = false;
  readonly trackKey = undefined;

  constructor(readonly key: string) {}

  get mithril() {
    return m('.time-axis-panel');
  }

  renderCanvas(ctx: CanvasRenderingContext2D, size: PanelSize) {
    ctx.fillStyle = '#999';
    ctx.textAlign = 'left';
    ctx.font = '11px Roboto Condensed';

    const offset = globals.timestampOffset();
    switch (timestampFormat()) {
    case TimestampFormat.Raw:
    case TimestampFormat.RawLocale:
      break;
    case TimestampFormat.Seconds:
    case TimestampFormat.Timecode:
      const width = renderTimestamp(ctx, offset, 6, 10, MIN_PX_PER_STEP);
      ctx.fillText('+', 6 + width + 2, 10, 6);
      break;
    case TimestampFormat.UTC:
      const offsetDate =
            Time.toDate(globals.utcOffset, globals.realtimeOffset);
      const dateStr = toISODateOnly(offsetDate);
      ctx.fillText(`UTC ${dateStr}`, 6, 10);
      break;
    case TimestampFormat.TraceTz:
      const offsetTzDate =
            Time.toDate(globals.traceTzOffset, globals.realtimeOffset);
      const dateTzStr = toISODateOnly(offsetTzDate);
      ctx.fillText(dateTzStr, 6, 10);
      break;
    }

    ctx.save();
    ctx.beginPath();
    ctx.rect(TRACK_SHELL_WIDTH, 0, size.width - TRACK_SHELL_WIDTH, size.height);
    ctx.clip();

    // Draw time axis.
    const span = globals.timeline.visibleTimeSpan;
    if (size.width > TRACK_SHELL_WIDTH && span.duration > 0n) {
      const maxMajorTicks = getMaxMajorTicks(size.width - TRACK_SHELL_WIDTH);
      const map = timeScaleForVisibleWindow(TRACK_SHELL_WIDTH, size.width);

      const tickGen = new TickGenerator(span, maxMajorTicks, offset);
      for (const {type, time} of tickGen) {
        if (type === TickType.MAJOR) {
          const position = Math.floor(map.timeToPx(time));
          ctx.fillRect(position, 0, 1, size.height);
          const domainTime = globals.toDomainTime(time);
          renderTimestamp(ctx, domainTime, position + 5, 10, MIN_PX_PER_STEP);
        }
      }
    }
    ctx.restore();
    ctx.fillRect(TRACK_SHELL_WIDTH - 2, 0, 2, size.height);
  }
}

function renderTimestamp(
  ctx: CanvasRenderingContext2D,
  time: time,
  x: number,
  y: number,
  minWidth: number,
) {
  const fmt = timestampFormat();
  switch (fmt) {
  case TimestampFormat.UTC:
  case TimestampFormat.TraceTz:
  case TimestampFormat.Timecode:
    return renderTimecode(ctx, time, x, y, minWidth);
  case TimestampFormat.Raw:
    return renderRawTimestamp(ctx, time.toString(), x, y, minWidth);
  case TimestampFormat.RawLocale:
    return renderRawTimestamp(ctx, time.toLocaleString(), x, y, minWidth);
  case TimestampFormat.Seconds:
    return renderRawTimestamp(ctx, Time.formatSeconds(time), x, y, minWidth);
  default:
    const z: never = fmt;
    throw new Error(`Invalid timestamp ${z}`);
  }
}

// Print a time on the canvas in raw format.
function renderRawTimestamp(
  ctx: CanvasRenderingContext2D,
  time: string,
  x: number,
  y: number,
  minWidth: number,
) {
  ctx.font = '11px Roboto Condensed';
  ctx.fillText(time, x, y, minWidth);
  return ctx.measureText(time).width;
}

// Print a timecode over 2 lines with this formatting:
// DdHH:MM:SS
// mmm uuu nnn
// Returns the resultant width of the timecode.
function renderTimecode(
  ctx: CanvasRenderingContext2D,
  time: time,
  x: number,
  y: number,
  minWidth: number,
): number {
  const timecode = Time.toTimecode(time);
  ctx.font = '11px Roboto Condensed';

  const {dhhmmss} = timecode;
  const thinSpace = '\u2009';
  const subsec = timecode.subsec(thinSpace);
  ctx.fillText(dhhmmss, x, y, minWidth);
  const {width: firstRowWidth} = ctx.measureText(subsec);

  ctx.font = '10.5px Roboto Condensed';
  ctx.fillText(subsec, x, y + 10, minWidth);
  const {width: secondRowWidth} = ctx.measureText(subsec);

  return Math.max(firstRowWidth, secondRowWidth);
}
