-- CutLimb
-- TODO if TheONlyCure. triggers an errors
function TocCheckIfStillInfected(part_data)
    if part_data == nil then
        return
    end
    -- Check ALL body part types to check if the player is still gonna die
    local check = false


    for _, v in ipairs(GetBodyParts()) do
        if part_data[v].is_infected then
            check = true
        end
    end

    if part_data.is_other_bodypart_infected then
        check = true
    end

    return check
end

function TocCureInfection(body_damage, part_data, part_name)

    local body_part_type = body_damage:getBodyPart(TocGetBodyPartTypeFromPartName(part_name))

    -- Check if we can heal the infection
    local is_other_bodypart_infected = getPlayer():getModData().TOC.Limbs.is_other_bodypart_infected

    if not is_other_bodypart_infected and not TheOnlyCure.CheckIfOtherLimbsAreInfected(part_data, part_name) then
        body_damage:setInfected(false)
        body_part_type:SetInfected(false)
        body_damage:setInfectionMortalityDuration(-1)
        body_damage:setInfectionTime(-1)
        body_damage:setInfectionLevel(0)
        local body_part_types = body_damage:getBodyParts()

        -- TODO I think this is enough... we should just cycle if with everything instead of that crap up there
        for i = body_part_types:size() - 1, 0, -1 do
            local bodyPart = body_part_types:get(i);
            bodyPart:SetInfected(false);
        end
    end


    if body_part_type:scratched() then body_part_type:setScratched(false, false) end
    if body_part_type:haveGlass() then body_part_type:setHaveGlass(false) end
    if body_part_type:haveBullet() then body_part_type:setHaveBullet(false, 0) end
    if body_part_type:isInfectedWound() then body_part_type:setInfectedWound(false) end
    if body_part_type:isBurnt() then body_part_type:setBurnTime(0) end
    if body_part_type:isCut() then body_part_type:setCut(false, false) end --Lacerations
    if body_part_type:getFractureTime() > 0 then body_part_type:setFractureTime(0) end





end

function TocDeleteOtherAmputatedLimbs(side)

    -- if left hand is cut and we cut left lowerarm, then delete hand


    for _, limb in pairs(TOC_limbs) do
        local part_name = "TOC.Amputation_" .. side .. "_" .. limb
        local amputated_limb = getPlayer():getInventory():FindAndReturn(part_name)
        if amputated_limb then
            getPlayer():getInventory():Remove(amputated_limb)
        end

    end

end

function TocGetKitInInventory(surgeon)
    local playerInv = surgeon:getInventory();
    local item = playerInv:getItemFromType('TOC.Real_surgeon_kit') or playerInv:getItemFromType('TOC.Surgeon_kit') or
        playerInv:getItemFromType('TOC.Improvised_surgeon_kit')
    return item

end

function TocGetSawInInventory(surgeon)

    local player_inv = surgeon:getInventory()
    local item = player_inv:getItemFromType("Saw") or player_inv:getItemFromType("GardenSaw") or
        player_inv:getItemFromType("Chainsaw")
    return item
end

-- OperateLimb
function SetBodyPartsStatusAfterOperation(player, part_data, part_name, use_oven)
    --for _, v in ipairs(GetBodyParts()) do


    local body_part_type = player:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromPartName(part_name))
    FixSingleBodyPartType(body_part_type, use_oven)

    for _, v in ipairs(part_data[part_name].depends_on) do
        local depended_body_part_type = player:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromPartName(v))
        FixSingleBodyPartType(depended_body_part_type, use_oven)

    end
end

function FixSingleBodyPartType(body_part_type, use_oven)
    body_part_type:setDeepWounded(false) --Basically like stitching
    body_part_type:setDeepWoundTime(0)
    if use_oven then
        body_part_type:AddDamage(100)
        body_part_type:setAdditionalPain(100);
        body_part_type:setBleeding(false)
        body_part_type:setBleedingTime(0) -- no bleeding since it's been cauterized
    else
        -- TODO Think a little better about this, do we want to trigger bleeding or not?
        body_part_type:setBleeding(false)

        --body_part_type:setBleedingTime(ZombRand(1, 5))   -- Reset the bleeding, maybe make it random
    end
end

-------------------------------------
-- Override helper

function CheckIfItemIsAmputatedLimb(item)
    -- TODO Benchmark if this is faster
    local item_full_type = item:getFullType()


    if string.find(item_full_type, "TOC.Amputation_") then
        return true
    else
        return false
    end


end

-- function CheckIfItemIsAmputatedLimb(item)


--     local item_full_type = item:getFullType()

--     local sides = {"Left", "Right"}
--     local limbs_to_check = {"Hand", "LowerArm", "UpperArm"}

--     local is_amputated_limb = false

--     for _, part in ipairs(limbs_to_check) do
--         for _, side in ipairs(sides) do

--             local part_name = side .. "_" .. part

--             local check_name = "TOC.Amputation_" .. part_name
--             print(check_name)
--             if item_full_type == check_name then
--                 is_amputated_limb = true
--                 break
--             end

--         end

--     end


--     return is_amputated_limb

-- end

function CheckIfItemIsProsthesis(item)

    -- TODO find a cleaner way
    local item_full_type = item:getFullType()
    local prosthesis_list = GetProsthesisList()

    for _, v in pairs(prosthesis_list) do
        if v == item_full_type then
            return true
        end
    end

    return false

end

function CheckIfItemIsInstalledProsthesis(item)
    local item_full_type = item:getFullType()
    if string.find(item_full_type, "TOC.Prost_") then
        return true
    else
        return false
    end

end
