/*
 * <p>Title: HuPIIRCM</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2008</p>
 * <p>Company: Institut de recherches cliniques de Montréal (IRCM)</p>
 */
package ca.qc.ircm.proteus.web.user.result;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sourceforge.stripes.action.After;
import net.sourceforge.stripes.action.Before;
import net.sourceforge.stripes.action.DefaultHandler;
import net.sourceforge.stripes.action.ForwardResolution;
import net.sourceforge.stripes.action.RedirectResolution;
import net.sourceforge.stripes.action.Resolution;
import net.sourceforge.stripes.action.UrlBinding;
import net.sourceforge.stripes.action.Wizard;
import net.sourceforge.stripes.controller.LifecycleStage;
import net.sourceforge.stripes.validation.Validate;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ca.qc.ircm.proteus.business.Relation;
import ca.qc.ircm.proteus.business.tdlc.RelationTdlc;
import ca.qc.ircm.proteus.web.BaseActionBean;
import ca.qc.ircm.proteus.web.annotation.Config;
import ca.qc.ircm.proteus.web.config.RelationConfig;

/**
 * Update relations having no status.
 * 
 * @author poitrac
 */
@UrlBinding("/user/relation/untreated/{event}")
@Wizard(startEvents={"input", "done"})
public class UntreatedRelationAction<R extends Relation> extends BaseActionBean {
    
    private final Logger logger = LoggerFactory.getLogger(UntreatedRelationAction.class);
    
    
    /**
     * Relations to update.
     */
    @Validate(on="select", required=true)
    private List<Long> oids;
    /**
     * Relations to update.
     */
    private List<R> relations;
    /**
     * Relations having no status.
     */
    private List<R> relationChoices;
    /**
     * List of equivalent Relations.
     */
    private Map<R, List<R>> equivalentRelationMap;
    /**
     * New information.
     */
    private RelationTdlc change;
    
    
    @Config private RelationConfig<R> relationConfig;
    
    
    /**
     * Populate relations having no status.
     */
    @Before(stages=LifecycleStage.BindingAndValidation)
    public void popRelationChoices() {
        logger.trace("begin");
        relationChoices = relationConfig.getService().getUntreatedRelationList(context.getProject());
        Collections.sort(relationChoices);
        equivalentRelationMap = new HashMap<R, List<R>>();
        for (R relation : relationChoices) {
            List<R> equivalent = relationConfig.getService().getEquivalentRelationList(relation);
            equivalentRelationMap.put(relation, equivalent);
        }
        logger.trace("end");
    }
    /**
     * Populate selected relations.
     */
    @After(stages=LifecycleStage.BindingAndValidation)
    public void popRelations() {
        logger.trace("begin");
        if (oids != null) {
            relations = new ArrayList<R>();
            for (Long oid : oids) {
                relations.add(relationConfig.get(oid));
            }
        }
        logger.trace("end");
    }
    /**
     * Populate relations having no status.
     */
    @Before(stages=LifecycleStage.BindingAndValidation)
    public void logEvent() {
        logger.trace(context.getEventName());
    }
    
    
    /**
     * Go to relation selection page.
     * @return relation selection page
     */
    @DefaultHandler
    public Resolution input() {
        logger.trace("begin");
        logger.trace("end");
        return new ForwardResolution("/WEB-INF/pages/user/relation/untreated/select.jsp");
    }
    /**
     * Go to update relation page.
     * @return update relation page
     */
    public Resolution select() {
        logger.trace("begin");
        logger.trace("end");
        return new ForwardResolution("/WEB-INF/pages/user/relation/untreated/update.jsp");
    }
    /**
     * Update relations.
     * @return redirect to done
     */
    public Resolution update() {
        logger.trace("begin");
        
        logger.trace("end");
        return new RedirectResolution(this.getClass(), "done").flash(this);
    }
    /**
     * Go to confirm page.
     * @return redirect to confirm page
     */
    public Resolution done() {
        logger.trace("begin");
        logger.trace("end");
        return new ForwardResolution("/WEB-INF/pages/user/relation/untreated/confirm.jsp");
    }
    
    
    public List<R> getRelationChoices() {
        return relationChoices;
    }
    public List<R> getRelations() {
        return relations;
    }
    public List<Long> getOids() {
        return oids;
    }
    public void setOids(List<Long> oids) {
        this.oids = oids;
    }
    public Map<R, List<R>> getEquivalentRelationMap() {
        return equivalentRelationMap;
    }
    public RelationTdlc getChange() {
        return change;
    }
    public void setChange(RelationTdlc change) {
        this.change = change;
    }
}
