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

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

#include "stnobj_s.hh"
#include "StrPrintf.hh"

//#define DEBUG



// コマンド読みとりスイッチの初期化ルーチン
void
station_obj_stationstop_variation :: readfile_additional_bool_set
()
{
  sw_rf_disturbance = false ;
}



// コマンド読みとりスイッチの評価ルーチン
bool
station_obj_stationstop_variation :: readfile_additional_bool_eval
()
{
  return sw_rf_disturbance ;
}



// ファイルリード（station_obj::readfile に追加する形）
void
station_obj_stationstop_variation :: readfile_additional_readfile
( FILE * hpoint ,
  commandvalue comval )
{

  switch ( comval )
  {

  case DISTURBANCE:
    // 列車を遅らせるか否か *****************************************
    // シミュレーションサイクルに入り最初に駅に到着した列車を遅らせる
    // なら Yes, そうでないなら No と答える。Yes の場合、これに続けて
    // 遅延関係のコマンドを挿入。************************************
    err_eof ( sw_rf_disturbance , h_file ) ;
    getcommand ( hpoint , h_file ) ;
    if ( cmpcommand ( "yes" ) || cmpcommand ( "Yes" )
	 || cmpcommand ( "YES" ) )
    {
      sw_disturb = true ;
      cerr << "Yes, disturbance willl occur on station_obj No. " ;
      cerr << get_stnno () << "\n" ;
    }
    else if ( cmpcommand ( "no" ) || cmpcommand ( "No" )
	      || cmpcommand ( "NO" ) )
    {
      sw_disturb = false ;
      cerr << "No, disturbance will NOT occur on station_obj No. " ;
      cerr << get_stnno () << "\n" ;
    }
    else
    {
      err_eof ( h_file ) ;
    }
    break ;

  default:
    err_eof ( h_file ) ;
  }

  if ( ! sw_disturb )
  {
    return ;	// 列車遅れはひき起こさせない, readfile も終了
  }

  bool sw_disttime = false ;
  bool sw_cd_type = false ;
  bool sw_cstnobjn = false ;
  bool sw_cstnobjv = false ;
  bool sw_cstnobjt = false ;

  while ( ! ( sw_disttime && sw_cd_type && sw_cstnobjn
	      && sw_cstnobjv && sw_cstnobjt ) )
  {

    comval = getcommandvalue ( hpoint , h_file ) ;

    switch ( comval )
    {

    case DISTURBANCE_TIME:
      // 列車を遅らせる時間 ******************************************
      // シミュレーションサイクルに入り最初に駅に到着した列車を駅に張
      // り付ける。
      // g_sw_freerun_cycle = false となったあとで最初に到着した列車は
      // これだけの時間当該駅に停車。
      // 後続は金論文の仮定に従って時隔を調節。***********************
      err_eof ( sw_disttime , h_file ) ;
      getdouble ( hpoint , h_file , d_init ) ;
      l_ofs << "Initial disturbance time: "
            << StrPrintf ( "%10.2f" , d_init ) << endl ;
      break ;

    case CONTROL_DISTURBANCE_TYPE:
      // 遅延回復制御の種類 ****************
      // 遅延回復制御の種類を述べる。
      // Without_control: なにもしない
      // Stop_at_station: 駅出発抑止
      // Slow_down_between: 駅間走行時分延伸
      err_eof ( sw_cd_type , h_file ) ;
      getcommand ( hpoint , h_file ) ;
      cerr << "control_disturbance_type: " ;
      if ( cmpcommand ( "Without_control" ) )
      {
	cd_type = Without_control ;
	cerr << "Without_control" << endl ;
      }
      else if ( cmpcommand ( "Stop_at_station" ) )
      {
	cd_type = Stop_at_station ;
	cerr << "Stop_at_station" << endl ;
      }
      else if ( cmpcommand ( "Slow_down_between" ) )
      {
	cd_type = Slow_down_between ;
	cerr << "Slow_down_between" << endl ;
      }
      else
      {
	err_eof ( h_file ) ;
      }
      break ;

    case CONTROL_STATION_OBJ_NUMBER:
      // 制御をかけるための前方 station_obj の番号 ******************
      // disturbance コマンドで遅れた列車の前方の列車に制御をかける。
      // そのコントロールの対象を指定。******************************
      err_eof ( sw_cstnobjn , h_file ) ;
      if ( cd_type == Without_control )
      {
	// このコマンド実行前に cd_type をセットせよ！
	err_eof ( h_file ) ;
      }
      getint ( hpoint , h_file , control_station_object_number ) ;
      cerr << "Controlling station_obj No. " ;
      cerr << control_station_object_number << endl ;
      break ;

    case CONTROL_STATION_OBJ_VALUE:
      // 制御量（単位：秒） *****************
      // 出発抑止、または駅到着遅延量を示す。
      err_eof ( sw_cstnobjv , h_file ) ;
      if ( cd_type == Without_control )
      {
	// このコマンド実行前に cd_type をセットせよ！
	err_eof ( h_file ) ;
      }
      getdouble ( hpoint , h_file , control_station_object_value ) ;
      l_ofs << "Controlling station_obj for "
            << StrPrintf ( "%10.2f [sec]" , control_station_object_value )
            << endl ;
      break ;

    case CONTROL_STATION_OBJ_TIME:
      // 制御をかけはじめる時刻（単位：秒） ***********
      // 遅延する列車の到着時刻に対する相対時間で示す。
      err_eof ( sw_cstnobjt , h_file ) ;
      if ( cd_type == Without_control )
      {
	// このコマンド実行前に cd_type をセットせよ！
	err_eof ( h_file ) ;
      }
      getdouble ( hpoint , h_file , control_station_object_time ) ;
      getdouble ( hpoint , h_file , control_station_object_value ) ;
      l_ofs << "Controlling station_obj at "
            << StrPrintf ( "%10.2f [sec] after arrival" ,
                           control_station_object_time ) << endl ;
      break ;

    default:
      err_eof ( h_file ) ;
    }
  }
}
