// 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 'environment.dart';

/// Returns the browser configuration based on the `package_lock.yaml` file in
/// the current engine workspace.
final PackageLock packageLock = PackageLock();

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

  PackageLock._fromYaml(YamlMap yaml) :
    chromeLock = ChromeLock._fromYaml(yaml['chrome'] as YamlMap),
    firefoxLock = FirefoxLock._fromYaml(yaml['firefox'] as YamlMap),
    edgeLock = EdgeLock._fromYaml(yaml['edge'] as YamlMap),
    esbuildLock = EsbuildLock._fromYaml(yaml['esbuild'] as YamlMap);

  final ChromeLock chromeLock;
  final FirefoxLock firefoxLock;
  final EdgeLock edgeLock;
  final EsbuildLock esbuildLock;
}

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

  /// The full version of Chromium represented by this lock. E.g: '119.0.6045.9'
  final String version;
}

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 EsbuildLock {
  EsbuildLock._fromYaml(YamlMap yaml) :
    version = yaml['version'] as String;

  final String version;
}
