// 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.

import 'utils.dart';

class MaskConstant {
  const MaskConstant({required this.name, required this.value, required this.description});

  const MaskConstant.platform({required String platform, required int value})
    : this(
        name: '$platform Plane',
        value: value,
        description: 'The plane value for the private keys defined by the $platform embedding.'
      );

  final String name;
  final int value;
  final String description;

  String get upperCamelName {
    return name
      .split(' ')
      .map<String>((String word) => lowerCamelToUpperCamel(word.toLowerCase()))
      .join();
  }

  String get lowerCamelName {
    final String upperCamel = upperCamelName;
    return upperCamel.substring(0, 1).toLowerCase() + upperCamel.substring(1);
  }
}

const MaskConstant kValueMask = MaskConstant(
  name: 'Value Mask',
  value: 0x00FFFFFFFF,
  description: 'Mask for the 32-bit value portion of the key code.',
);

const MaskConstant kPlaneMask = MaskConstant(
  name: 'Plane Mask',
  value: 0xFF00000000,
  description: 'Mask for the plane prefix portion of the key code.',
);

const MaskConstant kUnicodePlane = MaskConstant(
  name: 'Unicode Plane',
  value: 0x0000000000,
  description: 'The plane value for keys which have a Unicode representation.',
);

const MaskConstant kUnprintablePlane = MaskConstant(
  name: 'Unprintable Plane',
  value: 0x0100000000,
  description: 'The plane value for keys defined by Chromium and does not have a Unicode representation.',
);

const MaskConstant kFlutterPlane = MaskConstant(
  name: 'Flutter Plane',
  value: 0x0200000000,
  description: 'The plane value for keys defined by Flutter.',
);

const MaskConstant kStartOfPlatformPlanes = MaskConstant(
  name: 'Start Of Platform Planes',
  value: 0x1100000000,
  description: 'The platform plane with the lowest mask value, beyond which the keys are considered autogenerated.',
);

const MaskConstant kAndroidPlane = MaskConstant.platform(
  platform: 'Android',
  value: 0x1100000000,
);

const MaskConstant kFuchsiaPlane = MaskConstant.platform(
  platform: 'Fuchsia',
  value: 0x1200000000,
);

const MaskConstant kIosPlane = MaskConstant.platform(
  platform: 'iOS',
  value: 0x1300000000,
);

const MaskConstant kMacosPlane = MaskConstant.platform(
  platform: 'macOS',
  value: 0x1400000000,
);

const MaskConstant kGtkPlane = MaskConstant.platform(
  platform: 'Gtk',
  value: 0x1500000000,
);

const MaskConstant kWindowsPlane = MaskConstant.platform(
  platform: 'Windows',
  value: 0x1600000000,
);

const MaskConstant kWebPlane = MaskConstant.platform(
  platform: 'Web',
  value: 0x1700000000,
);

const MaskConstant kGlfwPlane = MaskConstant.platform(
  platform: 'GLFW',
  value: 0x1800000000,
);
