// Copyright (c) 2013, 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.

library protoc.const_generator;

import "indenting_writer.dart";
import 'string_escape.dart';

/// Writes JSON data as a Dart constant expression.
/// Accepts null, bool, num, String, and maps and lists.
void writeJsonConst(IndentingWriter out, val) {
  if (val is Map) {
    if (val.values.any(_nonEmptyListOrMap)) {
      out.addBlock(
          "const {", "}", () => _writeMapItems(out, val, vertical: true),
          endWithNewline: false);
    } else {
      out.print("const {");
      _writeMapItems(out, val);
      out.print("}");
    }
  } else if (val is List) {
    if (val.any(_nonEmptyListOrMap)) {
      out.addBlock(
          "const [", "]", () => _writeListItems(out, val, vertical: true),
          endWithNewline: false);
    } else {
      out.print("const [");
      _writeListItems(out, val);
      out.print("]");
    }
  } else if (val is String) {
    _writeString(out, val);
  } else if (val is num || val is bool) {
    out.print(val.toString());
  } else if (val == null) {
    out.print("null");
  } else {
    throw "not JSON: $val";
  }
}

bool _nonEmptyListOrMap(x) {
  if (x is List && x.isNotEmpty) return true;
  if (x is Map && x.isNotEmpty) return true;
  return false;
}

void _writeString(IndentingWriter out, String val) {
  out.print(quoted(val));
}

void _writeListItems(IndentingWriter out, List val, {bool vertical = false}) {
  var first = true;
  for (var item in val) {
    if (!first && !vertical) {
      out.print(", ");
    }
    writeJsonConst(out, item);
    if (vertical) {
      out.println(",");
    }
    first = false;
  }
}

void _writeMapItems(IndentingWriter out, Map<dynamic, dynamic> val,
    {bool vertical = false}) {
  var first = true;
  for (var key in val.keys) {
    if (!first && !vertical) out.print(", ");
    _writeString(out, key);
    out.print(": ");
    writeJsonConst(out, val[key]);
    if (vertical) {
      out.println(",");
    }
    first = false;
  }
}
