package com.sora.util.akatsuki;

import com.google.common.base.Objects;
import com.sora.util.akatsuki.Retained.RestorePolicy;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.FieldSpec.Builder;

public class RetainedTestField extends TestField {

	private boolean skip;
	private RestorePolicy policy;

	public RetainedTestField(Class<?> clazz, Class<?>... parameters) {
		super(clazz, parameters);
	}

	public RetainedTestField(Class<?> clazz, String name, Class<?>... parameters) {
		super(clazz, name, parameters);
	}

	public RetainedTestField(Class<?> clazz, String name, String initializer,
			Class<?>... parameters) {
		super(clazz, name, initializer, parameters);
	}

	public boolean skip() {
		return skip;
	}

	public RetainedTestField skip(boolean skip) {
		this.skip = skip;
		return this;
	}

	public RestorePolicy policy() {
		return policy;
	}

	public RetainedTestField policy(RestorePolicy policy) {
		this.policy = policy;
		return this;
	}

	@Override
	protected Builder fieldSpecBuilder() {
		final Builder builder = super.fieldSpecBuilder();
		final AnnotationSpec.Builder annotationBuilder = AnnotationSpec.builder(Retained.class);
		if (skip) {
			annotationBuilder.addMember("skip", "$L", true);
		}
		if (policy != null) {
			annotationBuilder.addMember("restorePolicy", "$T.$L", RestorePolicy.class, policy);
		}
		builder.addAnnotation(annotationBuilder.build());
		return builder;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o)
			return true;
		if (o == null || getClass() != o.getClass())
			return false;
		if (!super.equals(o))
			return false;
		RetainedTestField that = (RetainedTestField) o;
		return Objects.equal(skip, that.skip) && Objects.equal(policy, that.policy);
	}

	@Override
	public int hashCode() {
		return Objects.hashCode(super.hashCode(), skip, policy);
	}
}