package eu.dnetlib.espas.api.csw;

import eu.dnetlib.espas.api.csw.iterator.CswResourceIterator;
import eu.dnetlib.espas.api.csw.iterator.ResourceIterator;
import eu.dnetlib.espas.cql.*;
import org.apache.log4j.Logger;

import javax.sql.DataSource;
import java.util.regex.Pattern;

public class Csw {
    private static Logger logger = Logger.getLogger(Csw.class);

    private DataSource dataSource;

    public ResourceIterator getResourceIterator(String constraint) {

        /* todo
            acquisition             OK  (there is no acquisition schema in database)
            platform                OK
            operation               OK
            project                 OK
            instrument              OK
            instrumentType          OK
            computation             OK
            computationType         OK
            compositeprocess        OK  (there is no compositeprocess schema in database)
            observationCollection   OK
            observation             OK
         */

        ResourceIterator iterator = null;

        if (Pattern.compile("^[T|t]ype like '[O|o]bservation'").matcher(constraint).find()) {
            iterator = new CswResourceIterator(new ObservationTransformationVisitor(), dataSource, constraint, "observation");
        } else if (Pattern.compile("^[T|t]ype like '[C|c]omputation'").matcher(constraint).find()) {
            iterator = new CswResourceIterator(new ComputationTransformationVisitor(), dataSource, constraint, "computation");
        } else if (Pattern.compile("^[T|t]ype like '[C|c]omputationType'").matcher(constraint).find()) {
            iterator = new CswResourceIterator(new ComputationTypeTransformationVisitor(), dataSource, constraint, "computationtype");
        } else if (Pattern.compile("^[T|t]ype like '[I|i]nstrument'").matcher(constraint).find()) {
            iterator = new CswResourceIterator(new InstrumentTransformationVisitor(), dataSource, constraint, "instrument");
        } else if (Pattern.compile("^[T|t]ype like '[I|i]nstrumentType'").matcher(constraint).find()) {
            iterator = new CswResourceIterator(new InstrumentTypeTransformationVisitor(), dataSource, constraint, "instrumenttype");
        } else if (Pattern.compile("^[T|t]ype like '[O|o]bservationCollection'").matcher(constraint).find()) {
            iterator = new CswResourceIterator(new ObservationCollectionTransformationVisitor(), dataSource, constraint, "observationcollection");
        } else if (Pattern.compile("^[T|t]ype like '[O|o]bservedProperty'").matcher(constraint).find()) {
            iterator = new CswResourceIterator(new ObservedPropertyTransformationVisitor(), dataSource, constraint, "observedproperty");
        } else if (Pattern.compile("^[T|t]ype like '[P|p]latform'").matcher(constraint).find()) {
            iterator = new CswResourceIterator(new PlatformTransformationVisitor(), dataSource, constraint, "platform");
        } else if (Pattern.compile("^[T|t]ype like '[P|p]roject'").matcher(constraint).find()) {
            iterator = new CswResourceIterator(new ProjectTransformationVisitor(), dataSource, constraint, "project");
        } else if (Pattern.compile("^[T|t]ype like '[A|a]cquisition'").matcher(constraint).find()) {
            iterator = new CswResourceIterator(new AcquisitionTransformationVisitor(), dataSource, constraint, "acquisition");
        } else if (Pattern.compile("^[T|t]ype like '[O|o]peration'").matcher(constraint).find()) {
            iterator = new CswResourceIterator(new OperationTransformationVisitor(), dataSource, constraint, "operation");
        } else if (Pattern.compile("^[T|t]ype like '[C|c]omposite[P|p]rocess'").matcher(constraint).find()) {
            iterator = new CswResourceIterator(new CompositeProcessTransformationVisitor(), dataSource, constraint, "compositeprocess");
        } else if (Pattern.compile("^[T|t]ype like '[P|p]rocess[C|c]apability'").matcher(constraint).find()) {
            iterator = new CswResourceIterator(new ProcessCapabilityTransformationVisitor(), dataSource, constraint, "processcapability");
        }

        return iterator;
    }

    public DataSource getDataSource() {
        return dataSource;
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
}
