/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE and NOTICE files at the root of the source
 * tree and available online at
 *
 * http://www.dspace.org/license/
 */
package org.dspace.app.xmlui.aspect.submission.submit;

import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Request;
import org.apache.cocoon.environment.SourceResolver;
import org.apache.commons.lang.time.DateFormatUtils;
import org.dspace.app.xmlui.aspect.submission.AbstractStep;
import org.dspace.app.xmlui.utils.UIException;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.app.xmlui.wing.WingException;
import org.dspace.app.xmlui.wing.element.*;
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.ResourcePolicy;
import org.dspace.content.*;
import org.xml.sax.SAXException;

import java.io.IOException;
import java.sql.SQLException;
import java.util.Date;
import java.util.Map;


public class EditPolicyStep extends AbstractStep
{

	/** Language Strings **/
    protected static final Message T_head =message("xmlui.Submission.submit.EditPolicyStep.head");
    protected static final Message T_submit_save = message("xmlui.general.save");
    protected static final Message T_submit_cancel =message("xmlui.general.cancel");

	private ResourcePolicy resourcePolicy;
    private Bitstream bitstream;


	/**
	 * Establish our required parameters, abstractStep will enforce these.
	 */
	public EditPolicyStep()
	{
		this.requireSubmission = true;
		this.requireStep = true;
	}
	
	
	/**
	 * Get the bitstream we are editing
	 */
	public void setup(SourceResolver resolver, Map objectModel, String src, Parameters parameters) 
	throws ProcessingException, SAXException, IOException
	{ 
		super.setup(resolver,objectModel,src,parameters);
		this.resourcePolicy = (ResourcePolicy) submissionInfo.get(org.dspace.submit.step.AccessStep.SUB_INFO_SELECTED_RP);
        this.bitstream=submissionInfo.getBitstream();
	}

  
    public void addBody(Body body) throws SAXException, WingException,
            UIException, SQLException, IOException, AuthorizeException{

        Collection collection = submission.getCollection();
		String actionURL = contextPath + "/handle/"+collection.getHandle() + "/submit/" + knot.getId() + ".continue";
        Request request = ObjectModelHelper.getRequest(objectModel);
        Division div = body.addInteractiveDivision("submit-edit-policy", actionURL, Division.METHOD_POST, "primary submission");
        div.setHead(T_submission_head);
        addSubmissionProgressList(div);
        List edit = div.addList("submit-edit-file", List.TYPE_FORM);
        edit.setHead(T_head);

        div.addHidden("policy_id").setValue(resourcePolicy.getID());

        // if come from EditBitstreamPolicies
        if(bitstream!=null)
            div.addHidden("bitstream_id").setValue(bitstream.getID());

        AccessStepUtil asu = new AccessStepUtil(context);

        asu.addName(resourcePolicy.getRpName(), edit, errorFlag);

        asu.addListGroups(Integer.toString(resourcePolicy.getGroupID()), edit, errorFlag, collection);

        // radio buttons: Item will be visible / Embargo Access + date
        String selectedRadio=Integer.toString(AccessStep.RADIO_OPEN_ACCESS_ITEM_VISIBLE);
        if(resourcePolicy.getStartDate()!=null)
            selectedRadio = Integer.toString(AccessStep.RADIO_OPEN_ACCESS_ITEM_EMBARGOED);

        // this step is possible only in case of AdvancedForm
        String dateValue = "";
        if(resourcePolicy.getStartDate() != null){
            dateValue = DateFormatUtils.format(resourcePolicy.getStartDate(), "yyyy-MM-dd");
        }
        asu.addAccessRadios(selectedRadio, dateValue, edit, errorFlag, null);

        // Reason
        asu.addReason(resourcePolicy.getRpDescription(), edit, errorFlag);

        // Note, not standard control actions, this page just goes back to the upload step.
        org.dspace.app.xmlui.wing.element.Item actions = edit.addItem();
        actions.addButton(org.dspace.submit.step.AccessStep.FORM_EDIT_BUTTON_SAVE).setValue(T_submit_save);
		actions.addButton(org.dspace.submit.step.AccessStep.FORM_EDIT_BUTTON_CANCEL).setValue(T_submit_cancel);
    }
}
