module CBitProblems
    use SimulationVariables
    use json_module
	implicit none    
	public 
    contains
    
    subroutine BitProblemsToJson(parent)

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

        ! 1. create new node
        call json%create_object(p,'BitProblems')
        
        ! 2. add member of data type to new node
        call ProblemToJson(p,"JetWashout",data%problems%BitProblems%JetWashout)
        call ProblemToJson(p,"PlugJets",data%problems%BitProblems%PlugJets)
        call json%add(p, "JetWashoutCount",data%problems%BitProblems%JetWashoutCount)
        call json%add(p, "PlugJetsCount",data%problems%BitProblems%PlugJetsCount)
        ! 3. add new node to parent
        call json%add(parent,p)
    end subroutine

    
    subroutine ProcessBitProblemsDueTime(time)
        implicit none
        integer :: time
        if(data%problems%BitProblems%PlugJets%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BitProblems%PlugJets, ChangePlugJets, time)
        if(data%problems%BitProblems%JetWashout%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BitProblems%JetWashout, ChangeJetWashout, time)
    end subroutine
    
    subroutine ProcessBitProblemsDuePumpStrokes(strokes)
        implicit none
        integer :: strokes

        if(data%problems%BitProblems%PlugJets%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BitProblems%PlugJets, ChangePlugJets, strokes)
        if(data%problems%BitProblems%JetWashout%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BitProblems%JetWashout, ChangeJetWashout, strokes)
        
    end subroutine
    
    subroutine ProcessBitProblemsDueVolumePumped(volume)
        implicit none
        real(8) :: volume
        
        if(data%problems%BitProblems%PlugJets%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BitProblems%PlugJets, ChangePlugJets, volume)
        if(data%problems%BitProblems%JetWashout%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BitProblems%JetWashout, ChangeJetWashout, volume)
        
    end subroutine
    
    subroutine ProcessBitProblemsDueDistanceDrilled(distance)
        implicit none
        real(8) :: distance
        
        if(data%problems%BitProblems%PlugJets%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BitProblems%PlugJets, ChangePlugJets, distance)
        if(data%problems%BitProblems%JetWashout%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BitProblems%JetWashout, ChangeJetWashout, distance)
        
    end subroutine
    
    subroutine ChangePlugJets(status)
        USE FricPressDropVarsModule
        implicit none
        integer, intent (in) :: status
        ! if(associated(data%problems%BitProblems%PlugJetsPtr)) call data%problems%BitProblems%PlugJetsPtr(status)
        if(status == Clear_StatusType)          data%State%FricPressDrop%BitJetsPlugged = 0
        if(status == Executed_StatusType)       data%State%FricPressDrop%BitJetsPlugged = 1
    endsubroutine
    
    subroutine ChangeJetWashout(status)
        USE FricPressDropVarsModule
        implicit none
        integer, intent (in) :: status
        ! if(associated(data%problems%BitProblems%JetWashoutPtr)) call data%problems%BitProblems%JetWashoutPtr(status)
        if(status == Clear_StatusType)          data%State%FricPressDrop%BitJetsWashedOut = 0
        if(status == Executed_StatusType)       data%State%FricPressDrop%BitJetsWashedOut = 1
    endsubroutine

    
end module CBitProblems