//
// Copyright 2014 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
//

library charted.tool.build_unicode_segmentation_data;

import 'dart:async';
import 'package:http/http.dart' as http;
import 'package:charted/core/text_metrics/segmentation_utils.dart';

/// Unicode version
/// A new version of unicode is available every June.
const VERSION = '7.0.0';

/// URI for downloading the grapheme properties file.
const UCD_PROPERTIES_URL =
    'http://www.unicode.org/Public/${VERSION}/ucd/auxiliary/GraphemeBreakProperty.txt';

const LIBRARY_NAME = 'charted.core.text_metrics.segmentation_data';

/// License header for the generated file.
const HEADER = """
//
// Copyright 2014 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
//
// This is a generated file.
// Please use tool/build_unicode_segmentation-data.dart to update
//

/// Code ranges by their types for use with grapheme segmentation
/// of text in charts.
library $LIBRARY_NAME;

import "package:charted/core/text_metrics/segmentation_utils.dart";

""";

Future<String> _getPropertiesFile() => http.read(UCD_PROPERTIES_URL);

void _dumpPropertiesData(String data) {
  StringBuffer buffer = new StringBuffer();
  RegExp lineRegExp =
      new RegExp(r'([0-9A-F]{4})..([0-9A-F]{4})?\s+;\s([a-zA-Z]+)\s');

  buffer.write(HEADER);
  buffer.writeln('const CODE_POINT_BLOCKS = const[');

  List<List> items = [];
  data.split('\n').forEach((String line) {
    Match match = lineRegExp.matchAsPrefix(line);
    if (match == null) return;

    int start = int.parse(match.group(1), radix:16);
    int end =
        match.group(2) == null ? start : int.parse(match.group(2), radix:16);

    items.add([start, end, CodeUnitCategory[match.group(3)]]);
    items.sort((a, b) => (a.first as Comparable).compareTo(b.first));
  });

  buffer.write(items.map((List range) => range.join(', ')).join(',\n  '));
  buffer.writeln();
  buffer.writeln('];');
  print(buffer.toString());
}

main() {
  _getPropertiesFile().then((data) => _dumpPropertiesData(data));
}
