package com.capgemini.reports.snecmaobjects.visitor;

import com.capgemini.reports.snecmaobjects.admin.RFAdminAGRevision;
import com.capgemini.reports.snecmaobjects.admin.RFAdminAPRevision;
import com.capgemini.reports.snecmaobjects.admin.RFAdminARevision;
import com.capgemini.reports.snecmaobjects.admin.RFAdminRevision;
import com.capgemini.reports.snecmaobjects.descriptif.DescriptifRevision;
import com.capgemini.reports.snecmaobjects.generic.GenericAssembRevision;
import com.capgemini.reports.snecmaobjects.generic.GenericRevision;
import com.capgemini.reports.snecmaobjects.mockup.MockupRevision;
import com.capgemini.reports.snecmaobjects.part.*;
import com.capgemini.reports.snecmaobjects.product.ProductRevision;
import com.capgemini.reports.snecmaobjects.rf.RFGenericRevision;
import com.capgemini.reports.snecmaobjects.rf.RFPartAssembRevision;
import com.capgemini.reports.snecmaobjects.rf.RFPartRevision;
import com.capgemini.reports.snecmaobjects.supermodel.SuperModelRevision;

import java.io.Serializable;

/**
 * Interface representing the Receptor behaviour of a SnecmaObject.
 *
 * @param <T> produced output type
 */
public interface IReceptorVisitor<T> extends Serializable {

    /**
     * Visitor which can used the ProductRevision Receptor properties to make a chosen report.
     *
     * @param aProductRev ProductRevision
     * @return T
     *
     */
    T visitReceptor(final ProductRevision aProductRev);

    /**
     * Visitor which can used the GenericRevision Receptor properties to make a chosen report.
     *
     * @param aGenericRev GenericRevision
     * @return T
     *
     */
    T visitReceptor(final GenericRevision aGenericRev);

    /**
     * Visitor which can used the GenericAssembRevision Receptor properties to make a chosen report.
     *
     * @param aGenericAssembRev GenericAssembRevision
     * @return T
     *
     */
    T visitReceptor(final GenericAssembRevision aGenericAssembRev);


    /**
     * Visitor which can used the GenericRevision Receptor properties to make a chosen report.
     *
     * @param aSuperModelRev GenericRevision
     * @return T
     *
     */
    T visitReceptor(final SuperModelRevision aSuperModelRev);

    /**
     * Visitor which can used the AlternateRevision Receptor properties to make a chosen report.
     *
     * @param aAlternateRev AlternateRevision
     * @return T
     *
     */
    T visitReceptor(final AlternateRevision aAlternateRev);

    /**
     * Visitor which can used the SuperModelRevision Receptor properties to make a chosen report.
     *
    // * @param aSuperModelRev SuperModelRevision
     * @return T
     *
     */
    // T visitReceptor(final SuperModelRevision aSuperModelRev);



    /**
     * Visitor which can used the DETRevision Receptor properties to make a chosen report.
     *
     * @param aDetRev DETRevision
     * @return T
     *
     */
    T visitReceptor(final DETRevision aDetRev);

    /**
     * Visitor which can used the PartAeroRevision Receptor properties to make a chosen report.
     *
     * @param aPartAeroRev PartAeroRevision
     * @return T
     *
     */
    T visitReceptor(final PartAeroRevision aPartAeroRev);

    /**
     * Visitor which can used the PartNoAeroRevision Receptor properties to make a chosen report.
     *
     * @param aPartNoAeroRev PartNoAeroRevision
     * @return T
     *
     */
    T visitReceptor(final PartNoAeroRevision aPartNoAeroRev);

    /**
     * Visitor which can used the PartAssembRevision Receptor properties to make a chosen report.
     *
     * @param aPartAssembRev PartAssembRevision
     * @return T
     *
     */
    T visitReceptor(final PartAssembRevision aPartAssembRev);

    /**
     * Visitor which can used the PartMatRevision Receptor properties to make a chosen report.
     *
     * @param aPartMatRev PartMatRevision
     * @return T
     *
     */
    T visitReceptor(final PartMatRevision aPartMatRev);

    /**
     * Visitor which can used the StandardRevision Receptor properties to make a chosen report.
     *
     * @param aStandardRev StandardRevision
     * @return T
     *
     */
    T visitReceptor(final StandardRevision aStandardRev);

    /**
     * Visitor which can used the RFGenericRevision Receptor properties to make a chosen report.
     *
     * @param aRfGenericRev RFGenericRevision
     * @return T
     *
     */
    T visitReceptor(final RFGenericRevision aRfGenericRev);

    /**
     * Visitor which can used the RFPartAssembRevision Receptor properties to make a chosen report.
     *
     * @param aRfPartAssembRev RFPartAssembRevision
     * @return T
     *
     */
    T visitReceptor(final RFPartAssembRevision aRfPartAssembRev);

    /**
     * Visitor which can used the RFPartRevision Receptor properties to make a chosen report.
     *
     * @param aRfPartRev RFPartRevision
     * @return T
     *
     */
    T visitReceptor(final RFPartRevision aRfPartRev);

    /**
     * Visitor which can used the RFAdminRevision Receptor properties to make a chosen report.
     *
     * @param aRfAdminRev RFAdminRevision
     * @return T
     *
     */
    T visitReceptor(final RFAdminRevision aRfAdminRev);

    /**
     * Visitor which can used the RFAdminARevision Receptor properties to make a chosen report.
     *
     * @param aRfAdminARev RFAdminARevision
     * @return T
     *
     */
    T visitReceptor(final RFAdminARevision aRfAdminARev);

    /**
     * Visitor which can used the RFAdminAPRevision Receptor properties to make a chosen report.
     *
     * @param aRfAdminAPRev RFAdminAPRevision
     * @return T
     *
     */
    T visitReceptor(final RFAdminAPRevision aRfAdminAPRev);

    /**
     * Visitor which can used the RFAdminAGRevision Receptor properties to make a chosen report.
     *
     * @param aRfAdminAGRev RFAdminAGRevision
     * @return T
     *
     */
    T visitReceptor(final RFAdminAGRevision aRfAdminAGRev);

    /**
     * Visitor which can used the MockupRevision Receptor properties to make a chosen report.
     *
     * @param aMockupRev MockupRevision
     * @return T
     *
     */
    T visitReceptor(final MockupRevision aMockupRev);

    /**
     * Visitor which can used the DescriptifRevision Receptor properties to make a chosen report.
     *
     * @param aDescriptifRev DescriptifRevision
     * @return T
     *
     */
    T visitReceptor(final DescriptifRevision aDescriptifRev);

    T emptyRf();
}
