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

import 'package:args/args.dart';
import 'package:vitool/vitool.dart';

const String kCodegenComment =
  '// AUTOGENERATED FILE DO NOT EDIT!\n'
  '// This file was generated by vitool.\n';

void main(List<String> args) {
  final ArgParser parser = ArgParser();

  parser.addFlag(
      'help',
      abbr: 'h',
      negatable: false,
      help: "Display the tool's usage instructions and quit.",
  );

  parser.addOption(
      'output',
      abbr: 'o',
      help: 'Target path to write the generated Dart file to.',
  );

  parser.addOption(
      'asset-name',
      abbr: 'n',
      help: 'Name to be used for the generated constant.',
  );

  parser.addOption(
      'part-of',
      abbr: 'p',
      help: "Library name to add a dart 'part of' clause for.",
  );

  parser.addOption(
      'header',
      abbr: 'd',
      help: 'File whose contents are to be prepended to the beginning of '
            'the generated Dart file; this can be used for a license comment.',
  );

  parser.addFlag(
      'codegen_comment',
      abbr: 'c',
      defaultsTo: true,
      help: 'Whether to include the following comment after the header:\n'
            '$kCodegenComment',
  );

  final ArgResults argResults = parser.parse(args);

  if (argResults['help'] as bool ||
    !argResults.wasParsed('output') ||
    !argResults.wasParsed('asset-name') ||
    argResults.rest.isEmpty) {
    printUsage(parser);
    return;
  }

  final List<FrameData> frames = <FrameData>[
    for (final String filePath in argResults.rest) interpretSvg(filePath),
  ];

  final StringBuffer generatedSb = StringBuffer();

  if (argResults.wasParsed('header')) {
    generatedSb.write(File(argResults['header'] as String).readAsStringSync());
    generatedSb.write('\n');
  }

  if (argResults['codegen_comment'] as bool)
    generatedSb.write(kCodegenComment);

  if (argResults.wasParsed('part-of'))
    generatedSb.write('part of ${argResults['part-of']};\n');

  final Animation animation = Animation.fromFrameData(frames);
  generatedSb.write(animation.toDart('_AnimatedIconData', argResults['asset-name'] as String));

  final File outFile = File(argResults['output'] as String);
  outFile.writeAsStringSync(generatedSb.toString());
}

void printUsage(ArgParser parser) {
  print('Usage: vitool --asset-name=<asset_name> --output=<output_path> <frames_list>');
  print('\nExample: vitool --asset-name=_\$menu_arrow --output=lib/data/menu_arrow.g.dart assets/svg/menu_arrow/*.svg\n');
  print(parser.usage);
}
