// 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,
);
