package com.gmail.dpierron.tools.i18n;

import com.gmail.dpierron.tools.Helper;

import java.lang.reflect.Method;

public class MethodCallerConverter implements Object2StringConverter {

  private String methodName;

  public MethodCallerConverter() {
    super();
  }

  public MethodCallerConverter(String methodName) {
    this();
    this.methodName = methodName;
  }

  String getMethodName() {
    return methodName;
  }

  void setMethodName(String methodName) {
    this.methodName = methodName;
  }

  protected String callMethod(String methodName, Object o) {
    return callMethod(methodName, o, true);
  }

  protected String callMethod(String methodName, Object o, boolean returnObjectIfNull) {
    if (o == null)
      return null;

    if (methodName == null)
      return null;

    String result = null;

    // try calling a method on the object
    try {
      Method method = o.getClass().getDeclaredMethod(methodName);
      if (method != null)
        result = (String) method.invoke(o);
    } catch (Exception e) {
      // we don't give a tiny rat's ass
    }

    if (Helper.isNullOrEmpty(result) && returnObjectIfNull)
      result = o.toString();

    return result;
  }

  public String getStringValue(Object o) {
    return callMethod(getMethodName(), o);
  }

  public String getStringValueOrNull(Object o) {
    return callMethod(getMethodName(), o, false);
  }
}
