// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
//
// TODO: Remove once package:csv/csv.dart is migrated.
// @dart=2.9

import 'dart:io';

import 'package:csv/csv.dart';
import 'package:meta/meta.dart';

void main() {
  var csv = CsvCodec(eol: '\n');
  var data = csv.decoder.convert(File('data.csv').readAsStringSync());

  // Remove comments and empty lines.
  data.removeWhere((row) => row.length < 3);

  Directory('lib/src/generated').createSync(recursive: true);

  _writeGlyphSetInterface(data);
  _writeGlyphSet(data, ascii: false);
  _writeGlyphSet(data, ascii: true);
  _writeTopLevel(data);

  var result = Process.runSync(
      'pub', ['run', 'dart_style:format', '-w', 'lib/src/generated']);
  print(result.stderr);
  exit(result.exitCode);
}

/// Writes `lib/src/generated/glyph_set.dart`.
void _writeGlyphSetInterface(List<List> data) {
  var file =
      File('lib/src/generated/glyph_set.dart').openSync(mode: FileMode.write);
  file.writeStringSync(r'''
    // Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
    // for details. All rights reserved. Use of this source code is governed by a
    // BSD-style license that can be found in the LICENSE file.

    // Don't modify this file by hand! It's generated by tool/generate.dart.

    /// A class that provides access to every configurable glyph.
    ///
    /// This is provided as a class so that individual chunks of code can choose
    /// between [ascii] and [unicode] glyphs. For example:
    ///
    /// ```dart
    /// import 'package:term_glyph/term_glyph.dart' as glyph;
    ///
    /// /// Adds a vertical line to the left of [text].
    /// ///
    /// /// If [unicode] is `true`, this uses Unicode for the line. If it's
    /// /// `false`, this uses plain ASCII characters. If it's `null`, it
    /// /// defaults to [glyph.ascii].
    /// void addVerticalLine(String text, {bool unicode}) {
    ///   var glyphs =
    ///       (unicode ?? !glyph.ascii) ? glyph.unicodeGlyphs : glyph.asciiGlyphs;
    ///
    ///   return text
    ///       .split('\n')
    ///       .map((line) => '${glyphs.verticalLine} $line')
    ///       .join('\n');
    /// }
    /// ```
    abstract class GlyphSet {
      /// Returns [glyph] if [this] supports Unicode glyphs and [alternative]
      /// otherwise.
      String glyphOrAscii(String glyph, String alternative);
  ''');

  for (var glyph in data) {
    for (var line in glyph[3].split('\n')) {
      file.writeStringSync('/// $line\n');
    }

    file.writeStringSync('String get ${glyph[0]};');
  }

  file.writeStringSync('}');
  file.closeSync();
}

/// Writes `lib/src/generated/${prefix.toLowerCase()}_glyph_set.dart`.
///
/// If [ascii] is `true`, this writes the ASCII glyph set. Otherwise it writes
/// the Unicode glyph set.
void _writeGlyphSet(List<List> data, {@required bool ascii}) {
  var file =
      File('lib/src/generated/${ascii ? "ascii" : "unicode"}_glyph_set.dart')
          .openSync(mode: FileMode.write);

  var className = '${ascii ? "Ascii" : "Unicode"}GlyphSet';
  file.writeStringSync('''
    // Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
    // for details. All rights reserved. Use of this source code is governed by a
    // BSD-style license that can be found in the LICENSE file.

    // Don't modify this file by hand! It's generated by tool/generate.dart.

    import 'glyph_set.dart';

    /// A [GlyphSet] that includes only ${ascii ? "ASCII" : "Unicode"} glyphs.
    class $className implements GlyphSet {
      const $className();
      /// Returns [glyph] if [this] supports Unicode glyphs and [alternative]
      /// otherwise.
      @override
      String glyphOrAscii(String glyph, String alternative) =>
          ${ascii ? "alternative" : "glyph"};
  ''');

  var index = ascii ? 2 : 1;
  for (var glyph in data) {
    file.writeStringSync('''
      @override
      String get ${glyph[0]} => ${_quote(glyph[index])};
    ''');
  }

  file.writeStringSync('}');
  file.closeSync();
}

/// Writes `lib/src/generated/top_level.dart`.
void _writeTopLevel(List<List> data) {
  var file =
      File('lib/src/generated/top_level.dart').openSync(mode: FileMode.write);

  file.writeStringSync('''
    // Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
    // for details. All rights reserved. Use of this source code is governed by a
    // BSD-style license that can be found in the LICENSE file.

    // Don't modify this file by hand! It's generated by tool/generate.dart.

    import '../../term_glyph.dart' as glyph;
  ''');

  for (var glyph in data) {
    for (var line in glyph[3].split('\n')) {
      file.writeStringSync('/// $line\n');
    }

    file.writeStringSync('''
      ///
      /// If [ascii] is `false`, this is "${glyph[1]}". If it's `true`, this is
      /// "${glyph[2]}" instead.
      String get ${glyph[0]} => glyph.glyphs.${glyph[0]};
    ''');
  }

  file.closeSync();
}

String _quote(String input) => input.contains("'") ? '"$input"' : "'$input'";
