// 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.

import 'dart:io';

import 'package:csv/csv.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'";
