package org.jboss.resteasy.client.core;

import org.jboss.resteasy.client.ProxyBuilder;
import org.jboss.resteasy.client.ProxyConfig;
import org.jboss.resteasy.client.ProxyFactory;

import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.net.URI;

public class SubResourceInvoker implements MethodInvoker
{
   final ProxyConfig config;
   final Class<?> iface;
   final String base;
   final String format;

   public SubResourceInvoker(final URI uri, final Method method, final ProxyConfig config)
   {
      String base = uri.toString();
      if (!base.endsWith("/"))
         base = base + "/";
      this.base = base;
      this.iface = method.getReturnType();
      this.config = config;
      String path = method.getAnnotation(Path.class).value();
      if (path.startsWith("/"))
         path = path.substring(1);
      Annotation[][] params = method.getParameterAnnotations();
      int index = 1;
      for (Annotation[] param : params)
      {
         for (Annotation a : param)
         {
            if (a instanceof PathParam)
            {
               String name = ((PathParam) a).value();
               path = path.replaceFirst("\\{" + name + "(\\s)*(:.*)?\\}", "%" + index + "\\$s");
               break;
            }
         }
         index++;
      }
      this.format = path;
   }

   @Override
   public Object invoke(Object[] args)
   {
      String path = String.format(format, args);
      return ProxyBuilder.createProxy(iface, ProxyFactory.createUri(base + path), config);
   }
}