/**
 * 
 */
package org.minnal.instrument.resource.creator;

import java.util.List;
import java.util.Set;

import javassist.CtClass;
import javassist.bytecode.ConstPool;
import javassist.bytecode.annotation.Annotation;
import javassist.bytecode.annotation.StringMemberValue;

import javax.ws.rs.HttpMethod;
import javax.ws.rs.PUT;

import org.apache.velocity.Template;
import org.minnal.instrument.resource.ResourceWrapper.ResourcePath;
import org.minnal.instrument.resource.metadata.ResourceMetaData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.Lists;
import com.wordnik.swagger.annotations.ApiOperation;

/**
 * @author ganeshs
 *
 */
public class UpdateMethodCreator extends CreateMethodCreator {
	
	private static final Logger logger = LoggerFactory.getLogger(UpdateMethodCreator.class);
	
	/**
	 * @param ctClass
	 * @param resource
	 * @param resourcePath
	 * @param basePath
	 */
	public UpdateMethodCreator(CtClass ctClass, ResourceMetaData resource, ResourcePath resourcePath, String basePath) {
		super(ctClass, resource, resourcePath, basePath);
	}

	private static Template updateMethodTemplate = engine.getTemplate("META-INF/templates/update_method.vm");

	@Override
	protected Template getTemplate() {
		return updateMethodTemplate;
	}

	@Override
	protected Annotation getApiOperationAnnotation() {
		ConstPool constPool = getCtClass().getClassFile().getConstPool();
		Annotation annotation = new Annotation(ApiOperation.class.getCanonicalName(), constPool);
		annotation.addMemberValue("value", new StringMemberValue("Update " + getResourcePath().getNodePath().getName() + " by id", constPool));
		return annotation;
	}
	
	@Override
	protected Set<String> getPermissions() {
		return getPermissions(HttpMethod.PUT);
	}
	
	@Override
	protected List<Annotation> getApiResponseAnnotations() {
		return Lists.newArrayList(getNoContentResponseAnnotation(), getNotFoundResponseAnnotation(), getBadRequestResponseAnnotation());
	}
	
	@Override
	protected String getHttpMethod() {
		return HttpMethod.PUT;
	}

	@Override
	protected Class<?> getHttpAnnotation() {
		return PUT.class;
	}
	
	@Override
	protected List<Annotation> getApiAdditionalParamAnnotations() {
		return Lists.newArrayList();
	}
}