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 Component behaviour of a SnecmaObject.
 *
 * @param <T> produced output type
 */
public interface IComponentVisitor<T> extends Serializable {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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