// Copyright 2013 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 'dart:io' as io;

import 'package:path/path.dart' as path;
import 'package:yaml/yaml.dart';

import 'common.dart';
import 'environment.dart';

/// Returns the browser configuration based on the `browser_lock.yaml` file in
/// the current engine workspace.
final BrowserLock browserLock = BrowserLock();

/// Provides access to the contents of the `browser_lock.yaml` file.
class BrowserLock {
  factory BrowserLock() {
    final io.File lockFile = io.File(
      path.join(environment.webUiRootDir.path, 'dev', 'browser_lock.yaml'),
    );
    final YamlMap yaml = loadYaml(lockFile.readAsStringSync()) as YamlMap;
    return BrowserLock._fromYaml(yaml);
  }

  BrowserLock._fromYaml(YamlMap yaml) :
    chromeLock = ChromeLock._fromYaml(yaml['chrome'] as YamlMap),
    firefoxLock = FirefoxLock._fromYaml(yaml['firefox'] as YamlMap),
    edgeLock = EdgeLock._fromYaml(yaml['edge'] as YamlMap),
    safariIosLock = SafariIosLock._fromYaml(yaml['safari_ios'] as YamlMap);

  final ChromeLock chromeLock;
  final FirefoxLock firefoxLock;
  final EdgeLock edgeLock;
  final SafariIosLock safariIosLock;
}

class ChromeLock {
  ChromeLock._fromYaml(YamlMap yaml) :
    linux = (yaml['Linux'] as int).toString(),
    mac = (yaml['Mac'] as int).toString(),
    windows = (yaml['Win'] as int).toString();

  final String linux;
  final String mac;
  final String windows;

  /// Return the version of Chromium to use for the current operating system.
  String get versionForCurrentPlatform {
    return PlatformBinding.instance.getChromeBuild(this);
  }
}

class FirefoxLock {
  FirefoxLock._fromYaml(YamlMap yaml) :
    version = yaml['version'] as String;

  final String version;
}

class EdgeLock {
  EdgeLock._fromYaml(YamlMap yaml) :
      launcherVersion = yaml['launcher_version'] as String;

  final String launcherVersion;
}

class SafariIosLock {
  SafariIosLock._fromYaml(YamlMap yaml) :
    majorVersion = yaml['major_version'] as int,
    minorVersion = yaml['minor_version'] as int,
    device = yaml['device'] as String,
    heightOfHeader = yaml['height_of_header'] as int,
    heightOfFooter = yaml['height_of_footer'] as int,
    scaleFactor = yaml['scale_factor'] as double;

  final int majorVersion;
  final int minorVersion;
  final String device;
  final int heightOfHeader;
  final int heightOfFooter;
  final double scaleFactor;

  String get simulatorDescription => '$device with iOS $majorVersion.$minorVersion';
}
