module COperationScenariosVariables
    
    use CKellyConnectionEnumVariables
    use CElevatorConnectionEnumVariables
        
    use NotificationVariables
    ! use CCloseKellyCockLedNotificationVariables
    ! use CCloseSafetyValveLedNotificationVariables
    ! use CFillMouseHoleLedNotificationVariables
    ! use CIrIBopLedNotificationVariables
    ! use CIrSafetyValveLedNotificationVariables
    ! use CLatchLedNotificationVariables
    ! use COpenKellyCockLedNotificationVariables        
    ! use COpenSafetyValveLedNotificationVariables
    ! use CSlipsNotificationVariables
    ! use CSwingLedNotificationVariables
    ! use CTongNotificationVariables
    ! use CUnlatchLedNotificationVariables

    use PermissionsVariables
    ! use CInstallFillupHeadPermissionVariables
    ! use CInstallMudBucketPermissionVariables
    ! use CIrIbopPermissionVariables
    ! use CIrSafetyValvePermissionVariables
    ! use CRemoveFillupHeadPermissionVariables
    ! use CRemoveMudBucketPermissionVariables
        
    use SoftwareInputsVariables
    !use CHookHeight
    !use CIbopHeight
    !use CNearFloorConnection
    !use CSafetyValveHeight
    !use CSlackOff
    !use CStandRack
    !use CStringPressure
    !use CZeroStringSpeed
    
    ! use CStringUpdateVariables   
    
    use CUnityInputs
    !, only: Get_OutOfMouseHole,&
    !                        Get_Unlatch,&
    !                        Get_Latch,&
    !                        Get_SlipsUnSet,&
    !                        Get_SlipsSet,&
    !                        Get_BreakupTong,&
    !                        Get_MakeupTong,&
    !                        Get_NewHookHeight,&
    !                        Get_ElevatorConnectionPossible,&
    !                        Get_JointConnectionPossible,&
    !                        Get_NearMonkeyBoardPosition,&
    !                        Get_SingleSetInMouseHole,&
    !                        Get_SwingCenter
    use CUnityOutputs, only: GetRotaryRpm
    use UnitySignalVariables
    ! use CBucketEnumVariables
    ! use CElevatorEnumVariables
    ! use CHeadEnumVariables
    ! use CIbopEnumVariables
    ! use CKellyEnumVariables
    ! use CMouseHoleEnumVariables
    ! use COperationConditionEnumVariables
    ! use CSafetyValveEnumVariables
    ! use CSlipsEnumVariables
    ! use CSwingEnumVariables
    ! use CTongEnumVariables
    
    use PermissionsVariables
    ! use CFillupHeadPermissionVariables
    ! use CSwingDrillPermissionVariables
    ! use CSwingOffPermissionVariables
    ! use CSwingTiltPermissionVariables
    ! use CTdsStemJointHeight
    use CTdsConnectionModesEnumVariables
    use CTdsElevatorModesEnumVariables
    ! use CTdsSpineEnumVariables
    ! use CTdsSwingEnumVariables
    ! use CTdsTongEnumVariables
    ! use CTdsBackupClampVariables
    
    use CHoistingVariables
    use CTopDrivePanelVariables
    
    ! use CTdsPowerLedNotificationVariables
    ! use CTdsIbopLedNotificationVariables
    use NotificationVariables
    
    ! use CTdsTorqueWrenchLedNotificationVariables
    
    implicit none
    public
    type::OperationScenarioType
        real :: HKL = 63.76     ! Hook And Kelly Length
        real :: HL  = 17.81     ! Hook Length
        real :: PL  = 30.0      ! Pipe Length
        real :: SL  = 90.0      ! Stand Length
        real :: LG  = 8.0       ! Limit Gap
        real :: SG  = 3.0       ! Slips Gap
        real :: TG  = 4.0       ! Tong Gap
        real :: RE  = 3.0       ! Release
        real :: ECG = 2.3       ! Elevator Connection Gap

        !moved from enum/CElevatorConnectionEnum
        integer :: ElevatorConnection = 0
        type(VoidEventHandlerCollection) :: OnElevatorConnectionChange

        !moved from SoftwareOutputs/CStringUpdateVariables
        integer :: StringUpdate = 0
        type(IntegerEventHandlerCollection) :: OnStringUpdateChange
        
    end type OperationScenarioType
    
    type(OperationScenarioType)::OperationScenario

    enum, bind(c)
        enumerator STRING_UPDATE_NEUTRAL
        enumerator STRING_UPDATE_ADD_SINGLE
        enumerator STRING_UPDATE_ADD_STAND
        enumerator STRING_UPDATE_REMOVE_SINGLE
        enumerator STRING_UPDATE_REMOVE_STAND
    end enum


    contains
    
    subroutine Set_StringUpdate(v)
        implicit none
        integer , intent(in) :: v
        #ifdef ExcludeExtraChanges
                if(OperationScenario%StringUpdate == v) return
        #endif
        OperationScenario%StringUpdate = v
        call OperationScenario%OnStringUpdateChange%RunAll(v)
    end subroutine
    
    integer function Get_StringUpdate()
        implicit none
        Get_StringUpdate = OperationScenario%StringUpdate
    end function

    real(8) function TJH()
        use TD_DrillStemComponents
	    implicit none
	    TJH = TD_String%TopJointHeight
    end function
    
    real function TL()
	    implicit none
	    TL = 26.97
    end function
    
    real function NFC()
	    implicit none
	    NFC = Get_NearFloorConnection()
    end function
    

    subroutine Set_ElevatorConnection(v)
        implicit none
        integer , intent(in) :: v
        #ifdef ExcludeExtraChanges
            if(OperationScenario%ElevatorConnection == v) return
        #endif
        OperationScenario%ElevatorConnection = v
        
        #ifdef deb
            print*, 'OperationScenario%ElevatorConnection=', OperationScenario%ElevatorConnection
        #endif
        call OperationScenario%OnElevatorConnectionChange%RunAll()
    end subroutine
    
    integer function Get_ElevatorConnection()
        implicit none
        Get_ElevatorConnection = OperationScenario%ElevatorConnection
    end function

end module COperationScenariosVariables