package io.onedev.server.web.page.project.codecomments;

import org.apache.wicket.Session;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.request.flow.RedirectToUrlException;
import org.apache.wicket.request.mapper.parameter.PageParameters;

import com.google.common.base.Preconditions;

import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.CodeCommentManager;
import io.onedev.server.model.CodeComment;
import io.onedev.server.security.SecurityUtils;
import io.onedev.server.web.WebSession;
import io.onedev.server.web.page.project.ProjectPage;
import io.onedev.server.web.util.ConfirmClickModifier;

@SuppressWarnings("serial")
public class InvalidCodeCommentPage extends ProjectPage {

	public static final String PARAM_COEDE_COMMENT = "code-comment";
	
	private IModel<CodeComment> codeCommentModel;
	
	public InvalidCodeCommentPage(PageParameters params) {
		super(params);
		
		codeCommentModel = new LoadableDetachableModel<CodeComment>() {

			@Override
			protected CodeComment load() {
				Long codeCommentId = params.get(PARAM_COEDE_COMMENT).toLong();
				CodeComment codeComment = OneDev.getInstance(CodeCommentManager.class).load(codeCommentId);
				Preconditions.checkState(!codeComment.isValid());
				return codeComment;
			}

		};
	}

	private CodeComment getCodeComment() {
		return codeCommentModel.getObject();
	}
	
	@Override
	protected void onInitialize() {
		super.onInitialize();
		add(new Link<Void>("delete") {

			@Override
			public void onClick() {
				OneDev.getInstance(CodeCommentManager.class).delete(getCodeComment());
				
				Session.get().success("Code comment #" + getCodeComment().getId() + " deleted");
				
				String redirectUrlAfterDelete = WebSession.get().getRedirectUrlAfterDelete(CodeComment.class);
				if (redirectUrlAfterDelete != null)
					throw new RedirectToUrlException(redirectUrlAfterDelete);
				else
					setResponsePage(ProjectCodeCommentsPage.class, ProjectCodeCommentsPage.paramsOf(getProject()));
				
			}

			@Override
			protected void onConfigure() {
				super.onConfigure();
				setVisible(SecurityUtils.canManageCodeComments(getCodeComment().getProject()));
			}
			
		}.add(new ConfirmClickModifier("Really want to delete this code comment?")));
	}
	
	public static PageParameters paramsOf(CodeComment codeComment) {
		PageParameters params = ProjectPage.paramsOf(codeComment.getProject());
		params.add(PARAM_COEDE_COMMENT, codeComment.getId());
		return params;
	}
	
	@Override
	protected void onDetach() {
		codeCommentModel.detach();
		super.onDetach();
	}

	@Override
	protected boolean isPermitted() {
		return SecurityUtils.canReadCode(getProject());
	}
	
	@Override
	public void renderHead(IHeaderResponse response) {
		super.renderHead(response);
		response.render(CssHeaderItem.forReference(new ProjectCodeCommentsCssResourceReference()));
	}
	
}