// This may look like C code, but it is really -*- C++ -*-
// RTSS --- Railway Total System Simulator
// (c) TAKAGI Ryo (at Kogakuin University)
// stn_dept.cc --- functions for class station_obj: train departure control
// -----
// ChangeLog:
// 2007. 11. 22
//  Redirected log messages to l_file.
// -----

#include <cstdio>
#include <cstdlib>
#include <cmath>

#include "stnobj.hh"
#include "train.hh"
#include "StrPrintf.hh"

//#define DEBUG

// 列車出発告知
void station_obj::this_train_will_depart
( const train* trptr_arg ) const {
    this_train_will_depart_aaa( trptr_arg );	// 前半
    this_train_will_depart_baa( trptr_arg );	// 後半
}	// 分割の理由: 拡張クラスでこの2つの間に別なものをいれるため

// 列車出発告知・前半
void station_obj::this_train_will_depart_aaa
( const train* trptr_arg ) const {
    station_obj* stox = ( station_obj* ) this;	// const外しの cast

    // 自分がいる番線番号を発見させる
    int imove = stox->which_in_train_departure( trptr_arg );

    // depart する列車の notrw が 0 でないとだめ！
    if ( stox->train_departure[ imove ].notrw != 0 ) {
      l_ofs << "Error: Departing train does not have zero notrw" << endl ;
      cerr << "Error: Departing train does not have zero notrw" << endl ;
      exit ( 64 ) ;
    }

    // 発車するので……
    stox->train_departure[ imove ].is_at_station = false;

    // 現在時刻に発車
    stox->train_departure[ imove ].tdept_delay
        = t_sim - stox->train_departure[ imove ].tdept;

    stox->notrwtab[ 0 ] = false;	// notrw = 0 が発車 -> とりあえず

    // train_departure[ i ].notrw を更新
    // notrwtab[ notrw ] も更新
    for ( register int i = 0; i < nvoie; i++ ) {
        if ( i == imove ) continue;
        if ( stox->train_departure[ i ].is_at_station ) {
            int x_notrw
                = stox->train_departure[ i ].notrw--;
            stox->notrwtab[ x_notrw ] = false;
            stox->notrwtab[ stox->train_departure[ i ].notrw ] = true;
        }
    }
}

// 列車出発告知・後半
void station_obj::this_train_will_depart_baa
( const train* trptr_arg ) const {

    station_obj* stox = ( station_obj* ) this;	// const外しの cast

    // 時隔計算！
    stox->headway_cal();

    for ( register int i = 0; i < number(); i++ ) {	// 列車に対し信号
        data[ i ].tr_ptr->tell_signal_change();		// 現示変化を警告
    }
}

/**********************************************************
// Commented out...
void station_obj::this_train_will_depart
( const train* trptr_arg ) const {
    station_obj* stox = ( station_obj* ) this;	// const外しの cast

    // 自分がいる番線番号を発見させる
    int imove = stox->which_in_train_departure( trptr_arg );

    // depart する列車の notrw が 0 でないとだめ！
    if ( stox->train_departure[ imove ].notrw != 0 ) {
        fprintf( stderr,
                 "Error: Departing train does not have zero notrw\n" );
        exit( 64 );
    }

    // 発車するので……
    stox->train_departure[ imove ].is_at_station = false;

    // 現在時刻に発車
    stox->train_departure[ imove ].tdept_delay
        = t_sim - stox->train_departure[ imove ].tdept;

    stox->notrwtab[ 0 ] = false;	// notrw = 0 が発車 -> とりあえず

    // train_departure[ i ].notrw を更新
    // notrwtab[ notrw ] も更新
    for ( register int i = 0; i < nvoie; i++ ) {
        if ( i == imove ) continue;
        if ( stox->train_departure[ i ].is_at_station ) {
            int x_notrw
                = stox->train_departure[ i ].notrw--;
            stox->notrwtab[ x_notrw ] = false;
            stox->notrwtab[ stox->train_departure[ i ].notrw ] = true;
        }
    }

    // 時隔計算！
    stox->headway_cal();

    for ( i = 0; i < number(); i++ ) {		// 列車に対し信号
        data[ i ].tr_ptr->tell_signal_change();	// 現示変化を警告
    }
}
*****************************************************************/
