package com.capgemini.reports.bomlineholder.flattener.line;

import java.util.Map;

/**
 * Represents a set of objects having a strong Bom relationship. <br>
 * This interface is able to produce a result of type <code>T</code> from each type of line available.<br>
 * This interface extends {@link Comparable}, and by default uses the {@link SnecmaLine#getLineId() getLineId} method return value to compare, so a comparison whith an other line is a comparison of their nomenclature path, or structure.
 *
 * @param <T> the type of result to be produced: a {@link Map}, a {@link String}...
 * @param <U> a Transformer object producing results of type T
 */
public interface SnecmaLine<T, U> extends Comparable<SnecmaLine<T, U>> {

    /**
     * An Identifier for the line. Not unique.<br>
     * Identifies a the structure of this block of objects, for example by appending all their identifiers.<br>
     * Having the same getLineId is not like being equals, since some lesser important fields may be ignored during identifier creation.<br>
     *
     * @return the Identifier, as a {@link String}
     */
    String getLineId();

    /**
     * A counter for the line number in the nomenclature. <br>
     *
     * @return the line number
     */
    int getLineNumber();

    /**
     * The main method: produces a T object based on this line's properties.
     *
     * @param transformer the Transformer object
     * @return the output object
     */
    T transform(final U transformer);

    /**
     * Get the ID of the line's receptor.
     *
     * @return ID receptor
     */
    String getIDReceptor();

    /**
     * Get the receptor's name.
     *
     * @return receptor's name
     */
    String getNameReceptor();

    /**
     * Get the receptor revision.
     *
     * @return receptor's revision
     */
    String getRevisionReceptor();

    /**
     * Get the id of functional marker.
     *
     * @return ID Receptor Functional Marker
     */
    String getRepereName();

    /**
     * Get the revision of functional marker.
     *
     * @return revision functional marker
     */
    String getRepereRevision();

    /**
     * Get the object in charge marker.
     *
     * @return object in charge marker
     */
    String getResponsableRepere();

    /**
     * Get suivi montage of marker.
     *
     * @return suivi montage of marker
     */
    String getSuiviMontage();

    /**
     * Get ID component.
     *
     * @return ID component
     */
    String getIDComponent();

    /**
     * Get ID Revision Component.
     *
     * @return ID Revision Component
     */
    String getIDRevisionComponent();

    /**
     * Get type reference of the component.
     *
     * @return type reference of the component
     */
    String getTypeReference();

    /**
     * Get reference name of component.
     *
     * @return reference name
     */
    String getNameReference();

    /**
     * Get reference name of component, in English.
     *
     * @return reference name in english
     */
    String getDesignationENG();

    /**
     * Get the reference conceptor.
     *
     * @return reference conceptor
     */
    String getReferenceConceptor();

    /**
     * Get the reference transposed.
     *
     * @return the reference transposed
     */
    String getReferenceTransposed();

    /**
     * Get the reference associated.
     *
     * @return reference associated
     */
    String getReferenceAssociated();

    /**
     * Get the object in charge conception.
     *
     * @return responsable conception
     */
    String getResponsableConception();

    /**
     * Get management's article.
     *
     * @return management's article
     */
    String getArticleGestion();

    /**
     * Get classification.
     *
     * @return classification
     */
    String getClassement();

    /**
     * Get use's following.
     *
     * @return use's following
     */
    String getSuiviUtilisation();

    /**
     * Get lifetime's following.
     *
     * @return lifetime's following
     */
    String getSuiviDureeVie();

    /**
     * Get list of suppliers.
     *
     * @return list of suppliers
     */
    String[] getSuppliersList();

    /**
     * Get ALT.
     *
     * @return ALT
     */
    String getALT();

    /**
     * Gett SB.
     *
     * @return SB
     */
    String getSB();

    /**
     * Get quantity cumulated.
     *
     * @return quantity cumulated
     */
    String getQuantiteCumulee();

    /**
     * Get panachage.
     *
     * @return panachage
     */
    String getPanachage();

    /**
     * Get quantity.
     *
     * @return quantity
     */
    String getQuantite();

    /**
     * Get maquette.
     *
     * @return maquette
     */
    String getMaquetteInterneExterne();

    /**
     * Get Mass.
     *
     * @return mass
     */
    Double getMass();

    /**
     * Get Mass Unit.
     *
     * @return mass unit
     */
    String getMassUnit();
}
