package doprava;

import rup.česky.společně.P;
import rup.česky.tvary.Barva;
import rup.česky.tvary.AktivníPlátno;
import rup.česky.tvary.Multipřesouvač;


/*******************************************************************************
 * Instance třídy ObousměrnáKabina_11a představují kabinky pohybující se po linkách.
 *
 * @author
 * @version
 */
public class ObousměrnáKabina_11a extends Kabina_11a
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    private Směr směr;



//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ METODY TŘÍDY ======================================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří kruhovou kabinu, která se bude pohybovat zadanou rychlostí
     * po zadané lince.
     *
     * @param linka     Linka, po které se kabina pohybuje.
     * @param dopředu   Pohybuje-li se ze stanice k následující stanici.
     */
    public ObousměrnáKabina_11a( Linka linka, Směr směr )
    {
        //Vytvoří novou kabinu a rozjede ji k nísledující zastávce
        super( linka );
        this.směr = směr;
        AP.přidej( this );
    }


    /***************************************************************************
     * Vytvoří kruhovou kabinu, která se bude pohybovat zadanou rychlostí
     * po zadané lince.
     * 
     * @param linka    Linka, po které se kabina pohybuje.
     */
    public static ObousměrnáKabina_11a getInstance( 
                                       Linka linka, Směr směr )
    {
        ObousměrnáKabina_11a kabina = new ObousměrnáKabina_11a( linka, směr );
        kabina.přesunuto();
        return kabina;
    }


//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== PŘEKRYTÉ METODY IMPLEMENTOVANÝCH ROZHRANÍ =================================
//== PŘEKRYTÉ ABSTRAKTNÍ METODY RODIČOVSKÉ TŘÍDY ===============================
//== PŘEKRYTÉ KONKRÉTNÍ METODY RODIČOVSKÉ TŘÍDY ================================
//== NOVĚ ZAVEDENÉ METODY INSTANCÍ =============================================

    /***************************************************************************
     * Metoda vyžadovaná rozhraním IMultiposuvný: definuje akci,
     * která se má provést v okamžiku,
     * kdy je objekt doveden do požadované cílové pozicie.
     *
     * @param mp   Multipřesouvač, který kabinku dovedl do cíle.
     *             Ten bude pravděpodobně požádán, aby kabinku dovezl zase dál
     *             a v případě doražení do cílové stanice
     */
    public void přesunuto()
    {
        if( směr == Směr.VPŘED )
            další = další.getNásledující();
        else
            další = další.getPředchozí();

        P.čekej( linka.getČekání() );

        //Necháme kabinu přesunout na další zastávku
        Multipřesouvač mp = Multipřesouvač.getInstance();
        mp.přesuň( this,  další.getPozice(),  linka.getRychlost() );
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== VNOŘENÉ A VNITŘNÍ TŘÍDY ===================================================
//== TESTY A METODA MAIN =======================================================
}

