// Copyright (C) 2023 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this 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 {isEnumValue} from '../base/object_utils';

export enum TimestampFormat {
  Timecode = 'timecode',
  Raw = 'raw',
  RawLocale = 'rawLocale',
  Seconds = 'seconds',
  UTC = 'utc',
}

let timestampFormatCached: TimestampFormat|undefined;

const TIMESTAMP_FORMAT_KEY = 'timestampFormat';
const DEFAULT_TIMESTAMP_FORMAT = TimestampFormat.Timecode;

export function timestampFormat(): TimestampFormat {
  const storedFormat = localStorage.getItem(TIMESTAMP_FORMAT_KEY);
  if (storedFormat && isEnumValue(TimestampFormat, storedFormat)) {
    timestampFormatCached = storedFormat;
  } else {
    timestampFormatCached = DEFAULT_TIMESTAMP_FORMAT;
  }
  return timestampFormatCached;
}

export function setTimestampFormat(format: TimestampFormat) {
  timestampFormatCached = format;
  localStorage.setItem(TIMESTAMP_FORMAT_KEY, format);
}

export enum DurationPrecision {
  Full = 'full',
  HumanReadable = 'human_readable',
}

let durationFormatCached: DurationPrecision|undefined;

const DURATION_FORMAT_KEY = 'durationFormat';
const DEFAULT_DURATION_FORMAT = DurationPrecision.Full;

export function durationPrecision(): DurationPrecision {
  const storedFormat = localStorage.getItem(DURATION_FORMAT_KEY);
  if (storedFormat && isEnumValue(DurationPrecision, storedFormat)) {
    durationFormatCached = storedFormat;
  } else {
    durationFormatCached = DEFAULT_DURATION_FORMAT;
  }
  return durationFormatCached;
}

export function setDurationPrecision(format: DurationPrecision) {
  durationFormatCached = format;
  localStorage.setItem(DURATION_FORMAT_KEY, format);
}
