module OperationScenariosModule
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !! Paseted From ....Variables.f90
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    ! use OperationScenariosModule !
    ! use OperationScenariosModule !!CElevator...
    ! use COperationScenariosVariables
    use SimulationVariables
    use PermissionsModule
    ! use SoftwareInputsVariables
    use CUnityInputs
    use CUnityOutputs, only: GetRotaryRpm
    use UnitySignalVariables
    use UnitySignalsModule
    use PermissionsModule
    ! use CTdsElevatorModesEnumVariables !    
    use CHoistingVariables
    use CTopDrivePanelVariables
    use NotificationModule
    use SoftwareInputsModule

    contains

    subroutine OperationScenariosToJson(parent)

        type(json_value),pointer :: parent
        type(json_core) :: json
        type(json_value),pointer :: p

        ! 1. create new node
        call json%create_object(p,'OperationScenarios')
        
        ! 2. add member of data type to new node
        call json%add(p,"ElevatorConnection",data%State%OperationScenario%ElevatorConnection)
        call json%add(p,"StringUpdate",data%State%OperationScenario%StringUpdate)
        call json%add(p,"KellyConnection",data%State%OperationScenario%KellyConnection)
        
        ! 3. add new node to parent
        call json%add(parent,p)
    end subroutine

    ! moved from kellyConnectionEnum
    subroutine Set_KellyConnection(v)
        use CManifolds, Only: KellyConnected, KellyDisconnected
        implicit none
        integer , intent(in) :: v
        #ifdef ExcludeExtraChanges
            if(data%State%OperationScenario%KellyConnection == v) return
        #endif

        data%State%OperationScenario%KellyConnection = v
        
        if(data%State%OperationScenario%KellyConnection /= KELLY_CONNECTION_STRING) then
            call KellyDisconnected()
        else
            call KellyConnected()
        endif
        
        #ifdef deb
            print*, 'data%State%OperationScenario%KellyConnection=', data%State%OperationScenario%KellyConnection
        #endif
        !**call data%State%OperationScenario%OnKellyConnectionChange%RunAll()
    end subroutine
    
    integer function Get_KellyConnection()
        implicit none
        Get_KellyConnection = data%State%OperationScenario%KellyConnection
    end function
    
    subroutine Evaluate_KellyConnection()
        implicit none
        if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then
#ifdef OST
            print*, 'Evaluate_KellyConnection=TopDrive'
#endif
        endif
        if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then
#ifdef OST
            print*, 'Evaluate_KellyConnection=Kelly'
#endif

            !!OPERATION-CODE=4
            !if (Get_OperationCondition() == OPERATION_DRILL .and.&
            !    Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.&
            !    Get_Swing() == SWING_MOUSE_HOLE_END .and.& 
            !    Get_TongNotification() .and.&
            !    Get_FillMouseHoleLed() == .false. .and.&
            !    Get_Tong() == TONG_BREAKOUT_END) then
            !    
            !    call Set_FillMouseHoleLed(.true.)
            !    return
            !end if
        
        
        
            !OPERATION-CODE=1
            if (Get_OperationCondition() == OPERATION_DRILL .and.&
                !Get_JointConnectionPossible() .and.&
                Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.&
                Get_Swing() == SWING_WELL_END .and.& 
                !Get_TongNotification() .and.&
                Get_Tong() == TONG_MAKEUP_END) then
                !call Log_4('KELLY_CONNECTION_STRING')
                call Set_Tong(TONG_NEUTRAL)
                call Set_KellyConnection(KELLY_CONNECTION_STRING)
                return
            end if
        
            !OPERATION-CODE=2
            if (Get_OperationCondition() == OPERATION_DRILL .and.&
                Get_StringPressure() == 0 .and.&
                Get_HookHeight() <= (data%State%OperationScenario%HKL + Get_NearFloorConnection()) .and.&
                Get_KellyConnection() == KELLY_CONNECTION_STRING .and.&
                Get_Swing() == SWING_WELL_END .and.&  
                !Get_TongNotification() .and.&
                Get_Tong() == TONG_BREAKOUT_END) then
                call Set_Tong(TONG_NEUTRAL)
                call Set_KellyConnection(KELLY_CONNECTION_NOTHING)
                call Set_SwingLed(.true.)
                return
            end if
        
            
            !OPERATION-CODE=3    
            if (Get_OperationCondition() == OPERATION_DRILL .and.&
                !Get_JointConnectionPossible() .and.&
                Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.&
                Get_Swing() == SWING_MOUSE_HOLE_END .and.&
                !Get_TongNotification() .and.&
                Get_FillMouseHoleLed() .and.&
                Get_Tong() == TONG_MAKEUP_END) then
                call Set_Tong(TONG_NEUTRAL)
                call Set_KellyConnection(KELLY_CONNECTION_SINGLE)
                call Set_SwingLed(.false.)
                call Set_FillMouseHoleLed(.false.)
                call Set_MouseHole(MOUSE_HOLE_NEUTRAL)
                return
            end if
            
            
            !OPERATION-CODE=4  
            if (Get_OperationCondition() == OPERATION_DRILL .and.&
                Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.&
                Get_Swing() == SWING_MOUSE_HOLE_END .and.& 
                !Get_TongNotification() .and.&
                Get_FillMouseHoleLed() == .false. .and.&
                Get_Tong() == TONG_BREAKOUT_END) then
                call Set_Tong(TONG_NEUTRAL)
                call Set_KellyConnection(KELLY_CONNECTION_NOTHING)
                call Set_FillMouseHoleLed(.true.)
                call Set_MouseHole(MOUSE_HOLE_NEUTRAL)
                return
            end if
           
            !OPERATION-CODE=5
            if (Get_OperationCondition() == OPERATION_DRILL .and.&
                !Get_JointConnectionPossible() .and.&
                Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.&
                Get_Swing() == SWING_WELL_END .and.& 
                !Get_TongNotification() .and.&
                Get_Tong() == TONG_MAKEUP_END) then
                call Set_Tong(TONG_NEUTRAL)
                call Set_KellyConnection(KELLY_CONNECTION_STRING)
                call Set_StringUpdate(STRING_UPDATE_ADD_SINGLE)
                call Set_SwingLed(.false.)
                return
            end if
            
            !OPERATION-CODE=6
            if (Get_OperationCondition() == OPERATION_DRILL .and.&
                Get_StringPressure() == 0 .and.&
                Get_HookHeight() > 70.0 .and.&
                Get_KellyConnection() == KELLY_CONNECTION_STRING .and.&
                !Get_TongNotification() .and.&
                Get_Swing() == SWING_WELL_END .and.&
                Get_Tong() == TONG_BREAKOUT_END) then
                call Set_Tong(TONG_NEUTRAL)
                call Set_KellyConnection(KELLY_CONNECTION_SINGLE)
                call Set_StringUpdate(STRING_UPDATE_REMOVE_SINGLE)
                return
            end if

        endif      
            
    end subroutine
    
    ! subroutine Subscribe_KellyConnection()
    !     use CDrillingConsoleVariables
    ! use ConfigurationVariables
    ! use ConfigurationVariables
    !     implicit none
        
    !     call OnBreakoutLeverPress%Add(ButtonPress_Breakout)
    !     call OnMakeupLeverPress%Add(ButtonPress_Makeup)
    ! end subroutine
    
    subroutine ButtonPress_Breakout()
        implicit none
#ifdef deb
        print*, 'ButtonPress_Breakout on   ======>    CKellyConnectionEnum'
#endif
    end subroutine
    
    subroutine ButtonPress_Makeup()
        implicit none
#ifdef deb
        print*, 'ButtonPress_Makeup on   ======>    CKellyConnectionEnum'
#endif
    end subroutine


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

    real(8) function TJH()
        use TD_DrillStemComponents
	    implicit none
	    TJH = data%State%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(data%State%OperationScenario%ElevatorConnection == v) return
        #endif
        data%State%OperationScenario%ElevatorConnection = v
        
        #ifdef deb
            print*, 'data%State%OperationScenario%ElevatorConnection=', data%State%OperationScenario%ElevatorConnection
        #endif
        !**call data%State%OperationScenario%OnElevatorConnectionChange%RunAll()
    end subroutine
    
    integer function Get_ElevatorConnection()
        implicit none
        Get_ElevatorConnection = data%State%OperationScenario%ElevatorConnection
    end function

end module OperationScenariosModule