///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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_CS_DSFunctions
// 
//  Purpose:
//    This module contains the implementation of EPTF_CLL_CS_DSFunctions functions.
// 
//  Module depends on:
//    <EPTF_CLL_Common_Definitions>
//    <EPTF_CLL_DataSource_Definitions>
//    <EPTF_CLL_DataSourceClient_Functions>
//    <EPTF_CLL_Variable_Functions>
//
//  Module Parameters:
//
//  Current Owner:
//    Mihaly Miko (emihmik)
// 
//  Last Review Date:
//    2011-08-08
//
//  Detailed Comments:
//
//    Public functions:
//       -
//
//    All other functions in this module are private! 
//
///////////////////////////////////////////////////////////////

module EPTF_CLL_CS_DSFunctions {

//=========================================================================
// Import Part
//=========================================================================
import from EPTF_CLL_Common_Definitions all;
import from EPTF_CLL_CS_Definitions all;
import from EPTF_CLL_DataSource_Definitions all;
import from EPTF_CLL_Variable_Functions all;
import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_Logging_Functions all

friend module EPTF_CLL_CSAdmin_Functions;
//=========================================================================
// Functions
//========================================================================
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_CS_warning
  // 
  //  Purpose:
  //    Function to log a warning from CentralScheduling feature.
  //
  //  Parameters:
  //    - pl_message - *in* *charstring* - the message to log
  //
  //  Return Value:
  //    -
  //
  //  Errors & assertions:
  //    - 
  //
  //  Detailed Comments:
  //    -
  //
  ///////////////////////////////////////////////////////////
  friend function f_EPTF_CS_warning(in @lazy charstring pl_message)
  runs on EPTF_CS_ApplAdminBase_CT
  {
    f_EPTF_Logging_warningV2(pl_message, v_CS_ApplAdminBase_loggingMaskId, {c_EPTF_CS_loggingClassIdx_Warning});
  }


///////////////////////////////////////////////////////////
//  Group: DataSourceClient
// 
//  Purpose:
//    Functions related to DataSourceClient feature of the CentralScheduling
//
///////////////////////////////////////////////////////////
group DataSourceClient {
  
 
  ///////////////////////////////////////////////////////////
  //  Function: f_EPTF_CS_DSProcessData
  // 
  //  Purpose:
  //    Processes the incoming Data requests - iterators and external data elements - and gives back a variable name.
  //    Type function fcb_EPTF_DataSourceClient_dataHandler
  //
  //  Parameters:
  //    *out charstring pl_dataVarName* - this variable contains the value of the data or the iterator result
  //    *in charstring pl_source* - the name of the data source 'feature'
  //    *in charstring pl_ptcName* - the name of the ptc (ID of the PTC)  
  //    *in charstring pl_element* - the name of the data element
  //    *in* <EPTF_DataSource_Params> *pl_params* - the parameters
  //      of the data for the dataElement
  //
  //  Return Value:
  //    integer - error code (0 of OK, non zero if unsuccessful: e.g. invalid parameters given in pl_params)
  //
  //  Detailed Comments: 
  //    -
  //
  ///////////////////////////////////////////////////////////
  friend function f_EPTF_CS_DSProcessData(out charstring pl_dataVarName,
                                                in charstring pl_source,
                                                in charstring pl_ptcName,
                                                in charstring pl_element,
                                                in EPTF_DataSource_Params pl_params)
  runs on EPTF_CS_ApplAdminBase_CT return integer{   
    var EPTF_CharstringList pl_result := {}
    pl_dataVarName := "";
    var charstring vl_prefix := f_EPTF_Base_selfName() & ".";
    select(pl_element){  
     case(c_EPTF_CS_AvgLGenUsage){
        if(0 == f_EPTF_CS_getParams(pl_params, {}, pl_result)){
          pl_dataVarName := vl_prefix & c_EPTF_CS_AvgLGenUsage;   
        }
     } 
     case(c_EPTF_CS_MaxLGenUsage){
        if(0 == f_EPTF_CS_getParams(pl_params, {}, pl_result)){
          pl_dataVarName := vl_prefix & c_EPTF_CS_MaxLGenUsage;   
        }
     } 
     case else {  //error, no rule for that
        pl_dataVarName := "";
        f_EPTF_CS_warning(%definitionId& ": unhandled element: "& pl_element);
        return -1;
     }
    } 
    var integer vl_iteratorVarIdx := f_EPTF_Var_getId(pl_dataVarName);
    if(vl_iteratorVarIdx == -1){
      f_EPTF_CS_warning(%definitionId&": Invalid iterator or externalData or parameter: "&
        "\nSource: "&pl_source&
        "\nPTC : "&pl_ptcName &
        "\nElement Name : " &pl_element&
        "\nParams: " & log2str(pl_params));  
      return -1;
    }
    return 0;
  }


  
private function f_EPTF_CS_getParams(in EPTF_DataSource_Params pl_params,
                                           in EPTF_CharstringList pl_needed,
                                           out EPTF_CharstringList pl_result,
                                           in boolean pl_noWarning := false)
runs on EPTF_CS_ApplAdminBase_CT return integer {
  pl_result := {};
  if(sizeof(pl_params) == sizeof(pl_needed)){
     for(var integer j := 0; j < sizeof(pl_needed); j := j + 1){
       for(var integer i := 0; i < sizeof(pl_params); i:= i + 1){
         if(pl_params[i].paramName == pl_needed[j]){
           pl_result[sizeof(pl_result)] := pl_params[i].paramValue;
         }
       }
     }
     if(sizeof(pl_result) != sizeof(pl_needed)){
       if(not pl_noWarning){
         var EPTF_CharstringList vl_error := {};
         for(var integer i := 0; i < sizeof(pl_params); i:= i + 1){
           vl_error[i] := pl_params[i].paramName;
         }
         f_EPTF_CS_warning(%definitionId& ": Parameters are not correct: "&
         "\nReceived: "& log2str(vl_error)&
         "\nNeeded  : "& log2str(pl_needed) );
       }
       return -1;
     }
     return 0;
  } else{
    if(not pl_noWarning){
        var EPTF_CharstringList vl_error := {};
        for(var integer i := 0; i < sizeof(pl_params); i:= i + 1){
          vl_error[i] := pl_params[i].paramName;
        }
        if(sizeof(pl_params) < sizeof(pl_needed)){
           f_EPTF_CS_warning(%definitionId& ": Too few parameter is given: "&
           "\nReceived: "& log2str(vl_error)&
           "\nNeeded  : "& log2str(pl_needed));
        } else { 
           f_EPTF_CS_warning(%definitionId& ": Too many parameters are given: "&
           "\nReceived: "& log2str(vl_error)&
           "\nNeeded  : "& log2str(pl_needed));
        }
    }
    return -1;
  }
}



} // group

} // module
