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

enum Compiler {
  dart2js,
  dart2wasm
}

enum Renderer {
  html,
  canvaskit,
  skwasm,
}

class CompileConfiguration {
  CompileConfiguration(this.name, this.compiler, this.renderer);

  final String name;
  final Compiler compiler;
  final Renderer renderer;
}

class TestSet {
  TestSet(this.name, this.directory);

  final String name;
  final String directory;
}

class TestBundle {
  TestBundle(this.name, this.testSet, this.compileConfigs);

  final String name;
  final TestSet testSet;
  final List<CompileConfiguration> compileConfigs;
}

enum CanvasKitVariant {
  full,
  chromium,
}

enum BrowserName {
  chrome,
  edge,
  firefox,
  safari,
}

class RunConfiguration {
  RunConfiguration(this.name, this.browser, this.variant);

  final String name;
  final BrowserName browser;
  final CanvasKitVariant? variant;
}

class ArtifactDependencies {
  ArtifactDependencies({
    required this.canvasKit,
    required this.canvasKitChromium,
    required this.skwasm
  });

  ArtifactDependencies.none() :
    canvasKit = false,
    canvasKitChromium = false,
    skwasm = false;
  final bool canvasKit;
  final bool canvasKitChromium;
  final bool skwasm;

  ArtifactDependencies operator|(ArtifactDependencies other) {
    return ArtifactDependencies(
      canvasKit: canvasKit || other.canvasKit,
      canvasKitChromium: canvasKitChromium || other.canvasKitChromium,
      skwasm: skwasm || other.skwasm,
    );
  }

  ArtifactDependencies operator&(ArtifactDependencies other) {
    return ArtifactDependencies(
      canvasKit: canvasKit && other.canvasKit,
      canvasKitChromium: canvasKitChromium && other.canvasKitChromium,
      skwasm: skwasm && other.skwasm,
    );
  }
}

class TestSuite {
  TestSuite(
    this.name,
    this.testBundle,
    this.runConfig,
    this.artifactDependencies
  );

  String name;
  TestBundle testBundle;
  RunConfiguration runConfig;
  ArtifactDependencies artifactDependencies;
}

class FeltConfig {
  FeltConfig(
    this.compileConfigs,
    this.testSets,
    this.testBundles,
    this.runConfigs,
    this.testSuites,
  );

  factory FeltConfig.fromFile(String filePath) {
    final io.File configFile = io.File(filePath);
    final YamlMap yaml = loadYaml(configFile.readAsStringSync()) as YamlMap;

    final List<CompileConfiguration> compileConfigs = <CompileConfiguration>[];
    final Map<String, CompileConfiguration> compileConfigsByName = <String, CompileConfiguration>{};
    for (final dynamic node in yaml['compile-configs'] as YamlList) {
      final YamlMap configYaml = node as YamlMap;
      final String name = configYaml['name'] as String;
      final Compiler compiler = Compiler.values.byName(configYaml['compiler'] as String);
      final Renderer renderer = Renderer.values.byName(configYaml['renderer'] as String);
      final CompileConfiguration config = CompileConfiguration(name, compiler, renderer);
      compileConfigs.add(config);
      if (compileConfigsByName.containsKey(name)) {
        throw AssertionError('Duplicate compile config name: $name');
      }
      compileConfigsByName[name] = config;
    }

    final List<TestSet> testSets = <TestSet>[];
    final Map<String, TestSet> testSetsByName = <String, TestSet>{};
    for (final dynamic node in yaml['test-sets'] as YamlList) {
      final YamlMap testSetYaml = node as YamlMap;
      final String name = testSetYaml['name'] as String;
      final String directory = testSetYaml['directory'] as String;
      final TestSet testSet = TestSet(name, directory);
      testSets.add(testSet);
      if (testSetsByName.containsKey(name)) {
        throw AssertionError('Duplicate test set name: $name');
      }
      testSetsByName[name] = testSet;
    }

    final List<TestBundle> testBundles = <TestBundle>[];
    final Map<String, TestBundle> testBundlesByName = <String, TestBundle>{};
    for (final dynamic node in yaml['test-bundles'] as YamlList) {
      final YamlMap testBundleYaml = node as YamlMap;
      final String name = testBundleYaml['name'] as String;
      final String testSetName = testBundleYaml['test-set'] as String;
      final TestSet? testSet = testSetsByName[testSetName];
      if (testSet == null) {
        throw AssertionError('Test set not found with name: `$testSetName` (referenced by test bundle: `$name`)');
      }
      final dynamic compileConfigsValue = testBundleYaml['compile-configs'];
      final List<CompileConfiguration> compileConfigs;
      if (compileConfigsValue is String) {
        compileConfigs = <CompileConfiguration>[compileConfigsByName[compileConfigsValue]!];
      } else {
        compileConfigs = (compileConfigsValue as List<dynamic>).map(
          (dynamic configName) => compileConfigsByName[configName as String]!
        ).toList();
      }
      final TestBundle bundle = TestBundle(name, testSet, compileConfigs);
      testBundles.add(bundle);
      if (testBundlesByName.containsKey(name)) {
        throw AssertionError('Duplicate test bundle name: $name');
      }
      testBundlesByName[name] = bundle;
    }

    final List<RunConfiguration> runConfigs = <RunConfiguration>[];
    final Map<String, RunConfiguration> runConfigsByName = <String, RunConfiguration>{};
    for (final dynamic node in yaml['run-configs'] as YamlList) {
      final YamlMap runConfigYaml = node as YamlMap;
      final String name = runConfigYaml['name'] as String;
      final BrowserName browser = BrowserName.values.byName(runConfigYaml['browser'] as String);
      final dynamic variantNode = runConfigYaml['canvaskit-variant'];
      final CanvasKitVariant? variant = variantNode == null
        ? null
        : CanvasKitVariant.values.byName(variantNode as String);
      final RunConfiguration runConfig = RunConfiguration(name, browser, variant);
      runConfigs.add(runConfig);
      if (runConfigsByName.containsKey(name)) {
        throw AssertionError('Duplicate run config name: $name');
      }
      runConfigsByName[name] = runConfig;
    }

    final List<TestSuite> testSuites = <TestSuite>[];
    for (final dynamic node in yaml['test-suites'] as YamlList) {
      final YamlMap testSuiteYaml = node as YamlMap;
      final String name = testSuiteYaml['name'] as String;
      final String testBundleName = testSuiteYaml['test-bundle'] as String;
      final TestBundle? bundle = testBundlesByName[testBundleName];
      if (bundle == null) {
        throw AssertionError('Test bundle not found with name: `$testBundleName` (referenced by test suite: `$name`)');
      }
      final String runConfigName = testSuiteYaml['run-config'] as String;
      final RunConfiguration? runConfig = runConfigsByName[runConfigName];
      if (runConfig == null) {
        throw AssertionError('Run config not found with name: `$runConfigName` (referenced by test suite: `$name`)');
      }
      bool canvasKit = false;
      bool canvasKitChromium = false;
      bool skwasm = false;
      final dynamic depsNode = testSuiteYaml['artifact-deps'];
      if (depsNode != null) {
        for (final dynamic dep in depsNode as YamlList) {
          switch (dep as String) {
            case 'canvaskit':
              if (canvasKit) {
                throw AssertionError('Artifact dep $dep listed twice in suite $name.');
              }
              canvasKit = true;
            case 'canvaskit_chromium':
              if (canvasKitChromium) {
                throw AssertionError('Artifact dep $dep listed twice in suite $name.');
              }
              canvasKitChromium = true;
            case 'skwasm':
              if (skwasm) {
                throw AssertionError('Artifact dep $dep listed twice in suite $name.');
              }
              skwasm = true;
            default:
              throw AssertionError('Unrecognized artifact dependency: $dep');
          }
        }
      }
      final ArtifactDependencies artifactDeps = ArtifactDependencies(
        canvasKit: canvasKit,
        canvasKitChromium: canvasKitChromium,
        skwasm: skwasm
      );
      final TestSuite suite = TestSuite(name, bundle, runConfig, artifactDeps);
      testSuites.add(suite);
    }
    return FeltConfig(compileConfigs, testSets, testBundles, runConfigs, testSuites);
  }

  List<CompileConfiguration> compileConfigs;
  List<TestSet> testSets;
  List<TestBundle> testBundles;
  List<RunConfiguration> runConfigs;
  List<TestSuite> testSuites;
}
