///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Copyright (c) 2000-2019 Ericsson Telecom AB                               //
//                                                                           //
// All rights reserved. This program and the accompanying materials          //
// are made available under the terms of the Eclipse Public License v2.0     //
// which accompanies this distribution, and is available at                  //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                 //
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////
//  Module: EPTF_CLL_PTCDeployment_PrivateFunctions
// 
//  Purpose:
//    This module contains the implementation of the EPTF_PTCDeployment private functions.
// 
//  Module depends on:
//    <EPTF_CLL_Common_Definitions>
//    <EPTF_CLL_PTCDeployment_Definitions>
//    <EPTF_CLL_Base_Functions>
//    <EPTF_CLL_Logging_Functions>
// 
//  Current Owner:
//    Zsolt Szalai (EZSOSZA)
// 
//  Last Review Date:
//    2007-11-14
//
//  Detailed Comments:
//    This module contains the private functions for EPTF_PTCDeployment. 
//
///////////////////////////////////////////////////////////////
module EPTF_CLL_PTCDeployment_PrivateFunctions {

  import from EPTF_CLL_Common_Definitions all;
  import from EPTF_CLL_PTCDeployment_Definitions all;
  import from EPTF_CLL_Base_Functions all;
  import from EPTF_CLL_Logging_Functions all;

  friend module EPTF_CLL_PTCDeployment_Functions;

  ///////////////////////////////////////////////////////////
  //  Function: f_PTCD_role_in_database
  // 
  //  Purpose:
  //    Decides whether there is such a role in the database.
  //
  //  Parameters:
  //    pl_role - *in* *charstring*  - name of the role
  //    pl_roleindex - *out* *integer* - the index of the role in the database
  //
  //  Return Value:
  //    Boolean - true if the role is present
  //
  //  Errors:
  //    -
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  friend function f_PTCD_role_in_database(in charstring pl_role, out integer pl_roleindex) runs on EPTF_PTCD_CT return boolean {
    var integer i := 0;
    while (i < sizeof(v_roledatabase) and v_roledatabase[i].role != pl_role){i := i+1;}
    if (i == sizeof(v_roledatabase)) {return false;}
    else {pl_roleindex := i; return true;}
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_PTCD_choose_host
  // 
  //  Purpose:
  //    Main function on choosing the host from the role.
  //
  //  Parameters:
  //    pl_hostdeploymentlist - *in* <EPTF_HostDeploymentEntryList> - list of hosts and weights
  //    pl_method - *in* *integer* - methodology of choosing the host
  //
  //  Return Value:
  //    charstring - the host
  //
  //  Errors:
  //    Gives back "" on error
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  friend function f_PTCD_choose_host(in EPTF_HostDeploymentEntryList pl_hostdeploymentlist, in integer pl_method) runs on EPTF_PTCD_CT return charstring {
    var EPTF_HostDeploymentEntryList vl_hostlist:={};
    //filter for invalid hosts(empty host, or weight leq 0)
    for (var integer i:=0,j:=0;i<sizeof(pl_hostdeploymentlist);i:=i+1){
      if (pl_hostdeploymentlist[i].host != "" and not pl_hostdeploymentlist[i].weight<=0){
	vl_hostlist[j] := pl_hostdeploymentlist[i];
      j:=j+1;
      }
    }
    // filter for emptyness
    if (sizeof(vl_hostlist)==0){return "";}
    // get the host
    return vl_hostlist[f_PTCD_probrandomindex(vl_hostlist, pl_method)].host;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_PTCD_probrandomindex
  // 
  //  Purpose:
  //    Gets a random index from hostlist according to probability calculations.
  //
  //  Parameters:
  //    pl_hostdeploymentlist - *in* <EPTF_HostDeploymentEntryList> - list of hosts and weights
  //
  //  Return Value:
  //    integer - an index in the hostlist
  //
  //  Errors:
  //    -
  //
  //  Detailed Comments:
  //    Works in thw different way: Deterministic and using rnd to choose the index.
  //
  ///////////////////////////////////////////////////////////
  private function f_PTCD_probrandomindex(in EPTF_HostDeploymentEntryList pl_hostdeploymentlist, in integer method) runs on EPTF_PTCD_CT return integer {
    var integer size := sizeof(pl_hostdeploymentlist);
    if (method == 1){
      var EPTF_IntegerList burstlist := {};
      var EPTF_FloatList rof;
      for (var integer i:=0;i<size;i:=i+1){
	rof[i] := int2float(pl_hostdeploymentlist[i].weight);
      }
      var float sum:=0.0;
      for (var integer i:=0;i<sizeof(rof);i:=i+1){sum := sum + rof[i]}
      // normalize
      for(var integer i:=0;i<size;i:=i+1) {
	rof[i] := rof[i]/sum;
      }
      var integer r := 0;
      for(var integer i:=0;i<size;i:=i+1) {
	if (i>=sizeof(v_currentBurst)) {v_currentBurst[i] := 0.0;}
	v_currentBurst[i] := v_currentBurst[i]+rof[i];
	burstlist[i] := float2int(v_currentBurst[i]);
	v_currentBurst[i] := v_currentBurst[i] - int2float(burstlist[i]);
	if (burstlist[i] == 1) {r := i;}
      }
      log(burstlist, v_currentBurst, rof);
      return r;
    } else {
      // all inputs are valid now!
      var float scale := 100.0;
      if (sizeof(pl_hostdeploymentlist) == 1){return 0;}
      var EPTF_IntegerList roi;
      // get the weights in a record of integer
      for (var integer i:=0;i<size;i:=i+1){
	roi[i] := pl_hostdeploymentlist[i].weight;
      }
      var integer sum := f_sumroi(roi);
      // roi := scanl1(add,map(f_calcpercent,roi));
      roi[0] := float2int((int2float(roi[0])/int2float(sum)) * scale);
      for (var integer i:=1;i<size-1;i:=i+1){
	roi[i] := float2int((int2float(roi[i])/int2float(sum)) * scale) + roi[i-1];
      }
      roi[size-1] := float2int(scale);
      var integer rnum := float2int(rnd()*scale);
      var integer i := 0;
      // search for the proper interval and return it
      while(rnum>=roi[i]){i:=i+1;}
      return i;
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_sumroi
  // 
  //  Purpose:
  //    Sums up the elements of a record of integer.
  //
  //  Parameters:
  //    roi - *in* <EPTF_IntegerList> - list of integers
  //
  //  Return Value:
  //    integer - The sum
  //
  //  Errors:
  //    -
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  private function f_sumroi(in EPTF_IntegerList roi) return integer {
    var integer sum:=0;
    for (var integer i:=0;i<sizeof(roi);i:=i+1){sum := sum + roi[i]}
    return sum;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_PTCD_AddRole
  // 
  //  Purpose:
  //    Adds a role to the end of the database
  //
  //  Parameters:
  //    pl_ptcdentry - *in* <EPTF_PtcDeploymentEntry> - a role
  //
  //  Return Value:
  //    -
  //
  //  Errors:
  //    -
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  friend function f_PTCD_AddRole(in EPTF_PtcDeploymentEntry pl_ptcdentry) runs on EPTF_PTCD_CT {
    v_roledatabase[sizeof(v_roledatabase)] := pl_ptcdentry;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_PTCD_RemoveHost
  // 
  //  Purpose:
  //    Removes the given host from a role
  //
  //  Parameters:
  //    pl_roleindex - *in* *integer* - the role's index
  //    pl_host - *in* *charstring* - the host to erease
  //
  //  Return Value:
  //    -
  //
  //  Errors:
  //    -
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  friend function f_PTCD_RemoveHost(in integer pl_roleindex, in charstring pl_host) runs on EPTF_PTCD_CT {
    var EPTF_HostDeploymentEntryList data:={};
    for (var integer i:=0;i<sizeof(v_roledatabase[pl_roleindex].deployment);i:=i+1){
      if (v_roledatabase[pl_roleindex].deployment[i].host != pl_host) {
	data[sizeof(data)] := v_roledatabase[pl_roleindex].deployment[i];
      }
    }
    v_roledatabase[pl_roleindex].deployment := data;
  }

  group Logging {

  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_PTCDeployment_error
  // 
  //  Purpose:
  //    Function to log an error from PTCDeployment feature.
  //
  //  Parameters:
  //    - pl_message - *in* *charstring* - the message to log
  //
  //  Return Value:
  //    -
  //
  //  Errors & assertions:
  //    - 
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  friend function f_EPTF_PTCDeployment_error(in charstring pl_message)
  runs on EPTF_PTCD_CT
  {
    f_EPTF_Logging_error(true, tsp_EPTF_PTCDeployment_loggingComponentMask&": "&pl_message);
    f_EPTF_Base_stopAll();
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_PTCDeployment_warning
  // 
  //  Purpose:
  //    Function to log a warning from PTCDeployment feature.
  //
  //  Parameters:
  //    - pl_message - *in* *charstring* - the message to log
  //
  //  Return Value:
  //    -
  //
  //  Errors & assertions:
  //    - 
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  friend function f_EPTF_PTCDeployment_warning(in @lazy charstring pl_message)
  runs on EPTF_PTCD_CT
  {
    f_EPTF_Logging_warningV2(pl_message, v_PTCDeployment_loggingMaskId, {c_EPTF_PTCDeployment_loggingClassIdx_Warning});
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_PTCDeployment_debug
  // 
  //  Purpose:
  //    Function to log a debug message from PTCDeployment feature.
  //
  //  Parameters:
  //    - pl_message - *in* *charstring* - the message to log
  //
  //  Return Value:
  //    -
  //
  //  Errors & assertions:
  //    - 
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  friend function f_EPTF_PTCDeployment_debug(in @lazy charstring pl_message)
  runs on EPTF_PTCD_CT
  {
    f_EPTF_Logging_debugV2(pl_message, v_PTCDeployment_loggingMaskId, {c_EPTF_PTCDeployment_loggingClassIdx_Debug});
  }
  
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_PTCDeployment_debugEnabled
  // 
  //  Purpose:
  //    Function to check if debug is enabled for PTCDeployment
  //
  //  Parameters:
  //    -
  //
  //  Return Value:
  //    *boolean* - true if debug enalbed
  //
  //  Errors & assertions:
  //    - 
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  friend function f_EPTF_PTCDeployment_debugEnabled()
  runs on EPTF_PTCD_CT
  return boolean
  {
    return f_EPTF_Logging_isEnabled(v_PTCDeployment_loggingMaskId, c_EPTF_PTCDeployment_loggingClassIdx_Debug);
  }
} // group Logging

  

}
