--***********************************************************
--**                    ROBERT JOHNSON                     **
--***********************************************************

require "TimedActions/ISBaseTimedAction"

ISApplyBandage = ISBaseTimedAction:derive("ISApplyBandage");

function ISApplyBandage:isValid()
	if ISHealthPanel.DidPatientMove(self.character, self.otherPlayer, self.bandagedPlayerX, self.bandagedPlayerY) then
		return false
	end
    if self.item then
        return self.character:getInventory():contains(self.item);
    else
        if not self.bodyPart:bandaged() then return false end
        return true
    end
end

function ISApplyBandage:waitToStart()
    if self.character == self.otherPlayer then
        return false
    end
    self.character:faceThisObject(self.otherPlayer)
    return self.character:shouldBeTurning()
end

function ISApplyBandage:update()
    if self.character ~= self.otherPlayer then
        self.character:faceThisObject(self.otherPlayer)
    end
    if self.item then
        self.item:setJobDelta(self:getJobDelta());
    end
    local jobType = self.doIt and getText("ContextMenu_Bandage") or getText("ContextMenu_Remove_Bandage")
    ISHealthPanel.setBodyPartActionForPlayer(self.otherPlayer, self.bodyPart, self, jobType, { bandage = true })
    self.character:setMetabolicTarget(Metabolics.LightDomestic);
end

function ISApplyBandage:start()
    if self.character == self.otherPlayer then
        self:setActionAnim(CharacterActionAnims.Bandage);
        self:setAnimVariable("BandageType", ISHealthPanel.getBandageType(self.bodyPart));
    else
        self:setActionAnim("Loot")
        self.character:SetVariable("LootPosition", "Mid")
    end
    self:setOverrideHandModels(nil, nil);
    if self.item then
        self.item:setJobType(getText("ContextMenu_Apply_Bandage"));
        self.item:setJobDelta(0.0);
    end
end

function ISApplyBandage:stop()
    ISHealthPanel.setBodyPartActionForPlayer(self.otherPlayer, self.bodyPart, nil, nil, nil)
    ISBaseTimedAction.stop(self);
    if self.item then
        self.item:setJobDelta(0.0);
    end
end

function ISApplyBandage:perform()
    -- needed to remove from queue / start next.
    ISBaseTimedAction.perform(self);
    if self.item then
        self.item:setJobDelta(0.0);
    end

    if self.character:HasTrait("Hemophobic") and self.bodyPart:getBleedingTime() > 0 then
        self.character:getStats():setPanic(self.character:getStats():getPanic() + 50);
    end
    -- random a bandage life depending on the doctor skill
    if self.doIt then
        local bandageLife = ZombRandFloat((self.doctorLevel + 1) * 0.5, (self.doctorLevel + 1) * 1.0) + self.item:getBandagePower();
        if string.match(self.item:getType(), "Dirty") then
            bandageLife = 0;
        end
        if self.bodyPart:isGetBandageXp() and bandageLife > 0 then
            self.character:getXp():AddXP(Perks.Doctor, 5);
        end
        self.otherPlayer:getBodyDamage():SetBandaged(self.bodyPart:getIndex(), true, bandageLife, self.item:isAlcoholic(), self.item:getModule() .. "." .. self.item:getType());
        self.character:getInventory():Remove(self.item);
        if self.item:isInfected() then
            self.bodyPart:SetInfected(true);
        end
        -- apply bandage to model
--        if self.bodyPart:getType():getBandageModel() then
--            self.otherPlayer:addBandageModel(self.bodyPart:getType():getBandageModel());
--        end
        if isClient() then
            sendBandage(self.otherPlayer:getOnlineID(), self.bodyPart:getIndex(), true, bandageLife, self.item:isAlcoholic(), self.item:getModule() .. "." .. self.item:getType());
        end
    else
        if self.bodyPart:getBandageType() then
            local bandage = self.character:getInventory():AddItem(self.bodyPart:getBandageType())
            if self.bodyPart:getBandageLife() <= 0 then
                bandage:Use();
            end
--            else
--                self.character:getInventory():AddItem(self.bodyPart:getBandageType() .. "Dirty");
--            end
        end
        self.otherPlayer:getBodyDamage():SetBandaged(self.bodyPart:getIndex(), false, 0, false, nil);
--        self.otherPlayer:removeBandageModel(self.bodyPart:getType():getBandageModel());
        if isClient() then
            sendBandage(self.otherPlayer:getOnlineID(), self.bodyPart:getIndex(), false, 0, false, nil);
        end
    end
    ISHealthPanel.setBodyPartActionForPlayer(self.otherPlayer, self.bodyPart, nil, nil, nil)
end

function ISApplyBandage:new(doctor, otherPlayer, item, bodyPart, doIt)
	local o = {}
	setmetatable(o, self)
	self.__index = self
	o.character = doctor;
    o.otherPlayer = otherPlayer;
    o.doctorLevel = doctor:getPerkLevel(Perks.Doctor);
	o.item = item;
    o.doIt = doIt;
	o.bodyPart = bodyPart;
	o.stopOnWalk = bodyPart:getIndex() > BodyPartType.ToIndex(BodyPartType.Groin);
	o.stopOnRun = true;
    o.bandagedPlayerX = otherPlayer:getX();
    o.bandagedPlayerY = otherPlayer:getY();
    o.maxTime = 120 - (o.doctorLevel * 4);
    if doctor:isTimedActionInstant() then
        o.maxTime = 1;
        o.doctorLevel = 10;
    end
	return o;
end
