// 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 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 frames = <FrameData>[for (final String filePath in argResults.rest) interpretSvg(filePath)];

  final 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']}; // ignore: use_string_in_part_of_directives\n',
    );
  }

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

  final 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);
}
