module CHoistingProblems
    use SimulationVariables
	implicit none    
	public 
    contains
    subroutine HoistingProblemsToJson(parent)

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

        ! 1. create new node
        call json%create_object(p,'HoistingProblems')
        
        ! 2. add member of data type to new node
        call ProblemToJson(p,"MotorFail",data%problems%HoistingProblems%MotorFail)
        call ProblemToJson(p,"ClutchEngage",data%problems%HoistingProblems%ClutchEngage)
        call ProblemToJson(p,"ClutchDisengage",data%problems%HoistingProblems%ClutchDisengage)

        ! 3. add new node to parent
        call json%add(parent,p)
    end subroutine

    subroutine ProcessHoistingProblemsDueTime(time)
        implicit none
        integer :: time
        if(data%problems%HoistingProblems%MotorFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%HoistingProblems%MotorFail, ChangeMotorFail, time)
        if(data%problems%HoistingProblems%ClutchEngage%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%HoistingProblems%ClutchEngage, ChangeClutchEngage, time)
        if(data%problems%HoistingProblems%ClutchDisengage%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%HoistingProblems%ClutchDisengage, ChangeClutchDisengage, time)
    end subroutine
	
	subroutine ProcessHoistingProblemsDuePumpStrokes(strokes)
        implicit none
        integer :: strokes
        if(data%problems%HoistingProblems%MotorFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%HoistingProblems%MotorFail, ChangeMotorFail, strokes)
        if(data%problems%HoistingProblems%ClutchEngage%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%HoistingProblems%ClutchEngage, ChangeClutchEngage, strokes)
        if(data%problems%HoistingProblems%ClutchDisengage%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%HoistingProblems%ClutchDisengage, ChangeClutchDisengage, strokes)
    end subroutine
	
	subroutine ProcessHoistingProblemsDueVolumePumped(volume)
        implicit none
        real(8) :: volume
        if(data%problems%HoistingProblems%MotorFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%HoistingProblems%MotorFail, ChangeMotorFail, volume)
        if(data%problems%HoistingProblems%ClutchEngage%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%HoistingProblems%ClutchEngage, ChangeClutchEngage, volume)
        if(data%problems%HoistingProblems%ClutchDisengage%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%HoistingProblems%ClutchDisengage, ChangeClutchDisengage, volume)
    end subroutine
	
	subroutine ProcessHoistingProblemsDueDistanceDrilled(distance)
        implicit none
        real(8) :: distance
        if(data%problems%HoistingProblems%MotorFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%HoistingProblems%MotorFail, ChangeMotorFail, distance)
        if(data%problems%HoistingProblems%ClutchEngage%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%HoistingProblems%ClutchEngage, ChangeClutchEngage, distance)
        if(data%problems%HoistingProblems%ClutchDisengage%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%HoistingProblems%ClutchDisengage, ChangeClutchDisengage, distance)
    end subroutine
	
	
	
	
	
    
    subroutine ChangeMotorFail(status)
        use SimulationVariables !@
        implicit none
        integer, intent (in) :: status
        ! if(associated(MotorFailPtr)) call MotorFailPtr(status)
        if(status == Clear_StatusType)     data%State%Drawworks%MotorFaileMalf=0
        if(status == Executed_StatusType)  data%State%Drawworks%MotorFaileMalf=1
    endsubroutine
    
    subroutine ChangeClutchEngage(status)
        use SimulationVariables !@
        implicit none
        integer, intent (in) :: status
        ! if(associated(ClutchEngagePtr)) call ClutchEngagePtr(status)
        if(status == Clear_StatusType)     data%State%Drawworks%ClutchEngageMalf=0
        if(status == Executed_StatusType)  data%State%Drawworks%ClutchEngageMalf=1
    endsubroutine
    
    subroutine ChangeClutchDisengage(status)
        use SimulationVariables !@
        implicit none
        integer, intent (in) :: status
        ! if(associated(ClutchDisengagePtr)) call ClutchDisengagePtr(status)
        if(status == Clear_StatusType)     data%State%Drawworks%ClutchDisengageMalf=0
        if(status == Executed_StatusType)  data%State%Drawworks%ClutchDisengageMalf=1
    endsubroutine

end module CHoistingProblems