package org.camunda.bpm.swagger.maven.generator.step;

import java.lang.reflect.Method;
import java.util.Optional;

import javax.ws.rs.Path;

import com.helger.jcodemodel.JMethod;

import lombok.Data;
import lombok.EqualsAndHashCode;
import org.camunda.bpm.swagger.maven.generator.TypeHelper;

@Data
@EqualsAndHashCode(callSuper = true)
public class PathAnnotationStep extends AbstractMethodStep {

  private final MethodStep methodStep;
  private String path;

  public PathAnnotationStep(final MethodStep methodStep) {
    super(methodStep.getMethod());
    this.methodStep = methodStep;
  }

  public static String path(final String parentPathPrefix, final Method method) {
    final StringBuilder pathBuilder = parentPathPrefix == null ? new StringBuilder("") : new StringBuilder(parentPathPrefix);
    if (pathBuilder.length() > 0 && pathBuilder.lastIndexOf("/") == pathBuilder.length() - 1) {
      // ends with a "/", remove it
      pathBuilder.deleteCharAt(pathBuilder.length() - 1);
    }
    final String currentPath = Optional.ofNullable(method.getAnnotation(Path.class)).map(a -> a.value()).orElse("");
    if (!currentPath.isEmpty() && !currentPath.startsWith("/")) {
      pathBuilder.append("/").append(currentPath);
    } else {
      pathBuilder.append(currentPath);
    }
    return pathBuilder.toString();
  }

  public JMethod annotate(final String parentPathPrefix, final Method method) {

    this.path = path(parentPathPrefix, method);
    if (!TypeHelper.isResource(methodStep.getReturnType())) {
      getMethod().annotate(Path.class).param("value", this.path);
    }
    return getMethod();
  }
}