package com.capgemini.reports.snecmaobjects;

import com.capgemini.reports.snecmaobjects.visitor.IComponentVisitor;
import com.capgemini.reports.snecmaobjects.visitor.IReceptorVisitor;

import java.io.Serializable;

/**
 * Interface representing all the objects.
 */
public interface ISnecmaObject extends Serializable {

    /**
     * All the SnecmaObjects must accept the Receptor visitor to make the different reports.
     */
    <T> T accept(final IReceptorVisitor<T> aReceptorVisitor);

    /**
     * All the SnecmaObjects must accept the Component visitor to make the different reports.
     */
    <T> T accept(final IComponentVisitor<T> aComponentVisitor);

    /**
     * Getter for the type of the SnecmaObject.
     *
     * @return the type
     */
    String getType();

    /**
     * Getter for the Name of the SnecmaObject.
     *
     * @return the Name
     */
    String getName();

    /**
     * Getter for the Revision of the SnecmaObject.
     *
     * @return the Revision
     */
    String getRevisionId();

    /**
     * Getter for the Id of the SnecmaObject.
     *
     * @return the Id
     */
    String getItemId();

    /**
     * Return true if it is a Admin.
     *
     * @return the boolean
     */
    boolean isAdmin();

    /**
     * Return true if it is a Generic.
     *
     * @return the boolean
     */
    boolean isGeneric();

    /**
     * Return true if it is a SuperModel.
     *
     * @return the boolean
     */
    boolean isSuperModel();

    /**
     * Return true if it is a Part.
     *
     * @return the boolean
     */
    boolean isPart();

    /**
     * Return true if it is a RF.
     *
     * @return the boolean
     */
    boolean isRF();

    /**
     * Return true if it is a RF Generic.
     *
     * @return the boolean
     */
    boolean isRFGeneric();

    /**
     * Return true if it is a RF Part or a RF Part Assemb.
     *
     * @return the boolean
     */
    boolean isRFPartOrPartAssemb();

    /**
     * Return true if it is a Product.
     *
     * @return the boolean
     */
    boolean isProduct();

    /**
     * Return true if it is a Descriptif.
     *
     * @return the boolean
     */
    boolean isDescriptif();

    /**
     * Return true if it is a MockUp.
     *
     * @return the boolean
     */
    boolean isMockup();

}
