/*
 * Copyright (c) 2011 Google Inc.
 *
 * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
 * Public License v1.0 which accompanies this distribution, and is available at
 *
 * http://www.eclipse.org/legal/epl-v10.html
 */
package com.google.eclipse.protobuf.conversion;

import static org.eclipse.xtext.util.Strings.isEmpty;

import org.eclipse.xtext.conversion.ValueConverterException;
import org.eclipse.xtext.conversion.impl.AbstractLexerBasedConverter;
import org.eclipse.xtext.nodemodel.INode;

import java.math.BigInteger;

/**
 * Converts hexadecimal numbers to {@code long}s.
 *
 * @author alruiz@google.com (Alex Ruiz)
 */
public class HEXValueConverter extends AbstractLexerBasedConverter<Long> {

  /**
   * Creates an {@code int} from the given input, if the given input represents an hexadecimal number.
   * @param string the given input.
   * @param node the parsed node including hidden parts.
   * @return the new {@code int}.
   * @throws ValueConverterException if the given input is {@code null}, empty or does not represent an hexadecimal
   * number.
   */
  @Override public Long toValue(String string, INode node) throws ValueConverterException {
    if (isEmpty(string)) throw new ValueConverterException("Couldn't convert empty string to long.", node, null);
    if (!string.startsWith("0x") && !string.startsWith("0X")) throw parsingError(string, node);
    String withoutZeroX = string.substring(2, string.length());
    try {
      BigInteger value = new BigInteger(withoutZeroX, 16);
      return value.longValue();
    } catch (NumberFormatException e) {
      throw parsingError(string, node, e);
    }
  }

  private ValueConverterException parsingError(String string, INode node) {
    return parsingError(string, node, null);
  }

  private ValueConverterException parsingError(String string, INode node, Exception cause) {
    return new ValueConverterException("Couldn't convert '" + string + "' to long.", node, cause);
  }
}
