// 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';

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

final ArgParser argParser = ArgParser()
  ..addOption('output-dir')
  ..addOption('input-dir')
  ..addFlag('ui', defaultsTo: false)
  ..addFlag('engine', defaultsTo: false)
  ..addMultiOption('input');

const List<List<String>> uiPatterns = <List<String>>[
  <String>['library ui;', 'library dart.ui;'],
  <String>['part of ui;', 'part of dart.ui;'],
  <String>[
r'''
import 'src/engine.dart' as engine;
''',
r'''
import 'dart:_engine' as engine;
'''
  ],
  <String>[
r'''
export 'src/engine.dart'
    show persistedPictureFactory, houdiniPictureFactory, platformViewRegistry;
''',
r'''
export 'dart:_engine' show persistedPictureFactory, houdiniPictureFactory, webOnlyInitializeEngine;
''',
  ]
];

const List<List<String>> enginePatterns = <List<String>>[
  <String>['library engine;', 'library dart._engine;'],
  <String>['part of engine;', 'part of dart._engine;'],
  <String>[
r'''
import '../ui.dart' as ui;
''',
r'''
import 'dart:ui' as ui;
'''
  ]
];

const List<List<String>> sharedPatterns = <List<String>>[
  <String>["import 'package:meta/meta.dart';" ,''],
  <String>['@required', ''],
  <String>['@protected', ''],
  <String>['@mustCallSuper', ''],
  <String>['@immutable', ''],
  <String>['@visibleForTesting', '']
];

// Rewrites the "package"-style web ui library into a dart:ui implementation.
// So far this only requires a replace of the library declarations.
void main(List<String> arguments) {
  final ArgResults results = argParser.parse(arguments);
  final Directory directory = Directory(results['output-dir']);
  final String inputDirectoryPath = results['input-dir'];
  for (String inputFilePath in results['input']) {
    final File inputFile = File(inputFilePath);
    final File outputFile = File(path.join(directory.path, inputFile.path.substring(inputDirectoryPath.length)))
      ..createSync(recursive: true);
    String source = inputFile.readAsStringSync();
    final List<List<String>> replacementPatterns = <List<String>>[];
    replacementPatterns.addAll(sharedPatterns);
    if (results['ui']) {
      replacementPatterns.addAll(uiPatterns);
    } else if (results['engine']) {
      replacementPatterns.addAll(enginePatterns);
    }
    for (List<String> patterns in replacementPatterns) {
      source = source.replaceAll(patterns.first, patterns.last);
    }
    outputFile.writeAsStringSync(source);
  }
}