// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/// The platform that the browser is running on.
enum LayoutPlatform {
  /// Windows.
  win,
  /// Linux.
  linux,
  /// MacOS or iOS.
  darwin,
}

// The length of [LayoutEntry.printable].
const int _kPrintableLength = 4;

/// Describes the characters that a physical keyboard key will be mapped to
/// under different modifier states, for a given language on a given
/// platform.
class LayoutEntry {
  /// Create a layout entry.
  LayoutEntry(this.printables)
    : assert(printables.length == _kPrintableLength);

  /// The printable characters that a key should be mapped to under different
  /// modifier states.
  ///
  /// The [printables] always have a length of 4, corresponding to "without any
  /// modifiers", "with Shift", "with AltGr", and "with Shift and AltGr"
  /// respectively.
  ///
  /// Some values might be empty. It doesn't mean that these combinations will
  /// have an empty KeyboardKey.key, but usually these values are trivial,
  /// i.e. same as their non-modified counterparts.
  ///
  /// Some other values can be [kDeadKey]s. Dead keys are non-printable accents
  /// that will be combined into the following letter character.
  final List<String> printables;

  /// An empty [LayoutEntry] that produces dead keys under all conditions.
  static final LayoutEntry empty = LayoutEntry(
    const <String>['', '', '', '']);

  /// The value of KeyboardEvent.key for dead keys.
  static const String kDeadKey = 'Dead';
}

/// Describes the characters that all goal keys will be mapped to for a given
/// language on a given platform.
class Layout {
  /// Create a [Layout].
  const Layout(this.language, this.platform, this.entries);

  /// The language being used.
  final String language;

  /// The platform that the browser is running on.
  final LayoutPlatform platform;

  /// Maps from DOM `KeyboardKey.code`s to the characters they produce.
  final Map<String, LayoutEntry> entries;
}
