// Copyright 2017 The Chromium 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'] ||
    !argResults.wasParsed('output') ||
    !argResults.wasParsed('asset-name') ||
    argResults.rest.isEmpty) {
    printUsage(parser);
    return;
  }

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

  final StringBuffer generatedSb = StringBuffer();

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

  if (argResults['codegen_comment'])
    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']));

  final File outFile = File(argResults['output']);
  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);
}
