package org.seqcode.gsebricks.verbs.location;

import java.util.Map;

import org.seqcode.genome.location.Point;
import org.seqcode.genome.location.StrandedRegion;
import org.seqcode.gsebricks.types.*;
import org.seqcode.gsebricks.verbs.Mapper;


/**
 * Maps a StrandedRegion to its start site
 */
public class StrandedToStart<X extends StrandedRegion> implements Mapper<X,Point>, SelfDescribingVerb {

    public StrandedToStart() {}

    public Point execute(X a) {
        switch(a.getStrand()) { 
        case '+':
            return new Point(a.getGenome(),
                             a.getChrom(),
                             a.getStart());
        case '-':
            return new Point(a.getGenome(),
                             a.getChrom(),
                             a.getEnd());
        default:
            throw new IllegalArgumentException("Don't understand strand " + a.getStrand());
        }
    }
    
    
    private static final String[] inputNames = { "StrandedRegions" };
    private static final EchoType[] inputTypes = { new ClassType(StrandedRegion.class) };
    private static final EchoType outputType = new ClassType(Point.class); 
    
    public EchoType[] getInputClasses() {
        return inputTypes;
    }

    public String[] getInputNames() {
        return inputNames;
    }

    public EchoType getOutputClass() {
        return outputType;
    }

    public EchoType[] getParameterClasses() {
        return null;
    }

    public String[] getParameterNames() {
        return null;
    }

    public void init(Map<String, Object> params) {
    }
}
