--***********************************************************
--**                    THE INDIE STONE                    **
--**				  Author: turbotutone				   **
--***********************************************************
require "ISUI/ISPanel"

ISItemDropBox = ISPanel:derive("ISItemDropBox");

function ISItemDropBox:initialise()
    ISPanel.initialise(self)
end

function ISItemDropBox:createChildren()
    --instanceItem("item");
end

function ISItemDropBox:prerender()
    ISPanel.prerender(self);
end


function ISItemDropBox:render()
    ISPanel.render(self);

    if self.mouseOverState > 0 then
        local c, c2 = self.backgroundColor, self.borderColor;
        if self.mouseOverState == 1 and self.doHighlight then
            c, c2 = self.backgroundColorHL, self.borderColorHL;
        elseif self.mouseOverState == 2 and self.doValidHighlight then
            c, c2 = self.backgroundColorHLVal, self.borderColorHLVal;
        elseif self.mouseOverState == 3 and self.doInvalidHighlight then
            c, c2 = self.backgroundColorHLInv, self.borderColorHLInv;
        end

        self:drawRect(0, 0, self:getWidth(), self:getHeight(), c.a, c.r, c.g, c.b);
        self:drawRectBorder(0, 0, self:getWidth(), self:getHeight(), c2.a, c2.r, c2.g, c2.b);
    end

    if self.doBackDropTex and self.backDropTex and not self.storedItemTex then
        self:drawTextureScaled(self.backDropTex, 2, 2, self:getHeight()-4, self:getHeight()-4, self.backDropTexCol.a, self.backDropTexCol.r, self.backDropTexCol.g, self.backDropTexCol.b);
    end

    if self.storedItemTex then
        self:drawTextureScaled(self.storedItemTex, 2, 2, self:getHeight()-4, self:getHeight()-4, 1.0, 1.0, 1.0, 1.0);
    end
end

function ISItemDropBox:defaultVerifyItem( _item )
    return true;
end

function ISItemDropBox:hasValidItemInDrag()
    if not self.mouseEnabled then return false end

    local verifyFunc = self.onVerifyItem or self.defaultVerifyItem;
    if ISMouseDrag.dragging ~= nil and ISMouseDrag.draggingFocus ~= self then
        for k,v in ipairs(ISMouseDrag.dragging) do
            if instanceof(v, "InventoryItem") then
                if verifyFunc( self.functionTarget, v ) then return true; end
            elseif v.items and type(v.items)=="table" and #v.items > 1 then
                for k2,v2 in ipairs(v.items) do
                    if k2 ~= 1 and instanceof(v2, "InventoryItem") then
                        if verifyFunc( self.functionTarget, v2 ) then return true; end
                    end
                end
            end
        end
    end
end

function ISItemDropBox:onMouseMove(dx, dy)
    if not self.mouseEnabled then return; end

    self:activateToolTip();

    self.mouseOverState = 1;
    if self.boxOccupied == false and ISMouseDrag.dragging ~= nil and ISMouseDrag.draggingFocus ~= self then
        if self:hasValidItemInDrag() then
            self.mouseOverState = 2;
        else
            self.mouseOverState = 3;
        end
    end
end

function ISItemDropBox:onMouseMoveOutside(dx, dy)
    if not self.mouseEnabled then return; end

    self:deactivateToolTip();

    self.mouseOverState = 0;
end

function ISItemDropBox:onMouseDown(x, y)
end

function ISItemDropBox:onMouseUp(x, y)
    if not self:getIsVisible() or  self.boxOccupied == true or not self.mouseEnabled then
        return;
    end

    local items = {};
    local verifyFunc = self.onVerifyItem or self.defaultVerifyItem;
    --if ISMouseDrag.dragging ~= nil and ISMouseDrag.draggingFocus ~= self and ISMouseDrag.draggingFocus ~= nil then
    if ISMouseDrag.dragging ~= nil and ISMouseDrag.draggingFocus ~= self then
        for k,v in ipairs(ISMouseDrag.dragging) do
            if instanceof(v, "InventoryItem") then
                --v is a item;
                if verifyFunc( self.functionTarget, v ) then
                    table.insert(items, v);
                end
            elseif v.items and type(v.items)=="table" and #v.items > 1 then
                --find items;
                for k2,v2 in ipairs(v.items) do
                    if k2 ~= 1 and instanceof(v2, "InventoryItem") then
                        --v2 is inventory item.
                        if verifyFunc( self.functionTarget, v2 ) then
                            table.insert(items, v2);
                        end
                    end
                end
            end
        end
    end

    if self.onItemDropped then
        self.onItemDropped( self.functionTarget, items )
    else
        self:itemDropped( items );
    end
end

function ISItemDropBox:onRightMouseUp(x, y)
    if not self.mouseEnabled then return; end

    if self.boxOccupied == true then
        if self.onItemRemove then
            self.onItemRemove( self.functionTarget );
        else
            self:setStoredItem( nil );
        end
    end
end

--default behaviour oughta be overriden, picks first of list
function ISItemDropBox:itemDropped( _items )
    if _items[1] then
        self:setStoredItem( _items[1] );
    end
end

function ISItemDropBox:setStoredItem( _item )
    -- set stored item
    if self.storeItem == true then
        self.storedItem = _item;
    end
    if _item then
        self.boxOccupied = true;
        self.storedItemTex = _item:getTex();
    else
        self.boxOccupied = false;
        self.storedItemTex = nil;
    end
end

function ISItemDropBox:setStoredItemFake( _itemTex )
    if _itemTex then
        self.boxOccupied = true;
        self.storedItemTex = _itemTex;
    else
        self.boxOccupied = false;
        self.storedItemTex = nil;
    end
end

function ISItemDropBox:setBackDropTex( _tex, _a, _r, _g, _b )
    self.backDropTex = _tex;
    if _a and _r and _g and _b then
        self.backDropTexCol = { r = _r, g=_g, b=_b, a=_a };
    end
end
function ISItemDropBox:setDoBackDropTex( _b )
    self.doBackDropTex = _b;
end

function ISItemDropBox:setToolTip( _b, _text )
    self.doToolTip = _b;
    if _b == true and _text then
        self.toolTipText = _text;
    end
end

function ISItemDropBox:activateToolTip()
    if self.doToolTip then
        if self.toolTip ~= nil then
            self.toolTip:setVisible(true);
            self.toolTip:addToUIManager();
            self.toolTip:bringToTop()
        else
            self.toolTip = ISToolTip:new(item);
            self.toolTip:initialise();
            self.toolTip:addToUIManager();
            self.toolTip:setOwner(self);
            self.toolTip.description = self.toolTipText; --"Drag a battery in here, or rightclick to remove it.";
            self.toolTip:doLayout();
        end
    end
end
function ISItemDropBox:deactivateToolTip()
    if self.toolTip then
        self.toolTip:removeFromUIManager();
        self.toolTip:setVisible(false);
        self.toolTip = nil;
    end
end

function ISItemDropBox:setHighlight( _b, _a, _r, _g, _b, _a2, _r2, _g2, _b2 )
    self.doHighlight = _b;
    if _b == true and _a and _r and _g and _b  and _a2 and _r2 and _g2 and _b2 then
        self.backgroundColorHL = {r=_r, g=_g, b=_b, a=_a};
        self.borderColorHL = {r=_r2, g=_g2, b=_b2, a=_a2};
    end
end
function ISItemDropBox:setValidHighlight( _b, _a, _r, _g, _b, _a2, _r2, _g2, _b2 )
    self.doValidHighlight = _b;
    if _b == true and _a and _r and _g and _b  and _a2 and _r2 and _g2 and _b2 then
        self.backgroundColorHLVal = {r=_r, g=_g, b=_b, a=_a};
        self.borderColorHLVal = {r=_r2, g=_g2, b=_b2, a=_a2};
    end
end
function ISItemDropBox:setInvalidHighlight( _b, _a, _r, _g, _b, _a2, _r2, _g2, _b2 )
    self.doInvalidHighlight = _b;
    if _b == true and _a and _r and _g and _b  and _a2 and _r2 and _g2 and _b2 then
        self.backgroundColorHLInv = {r=_r, g=_g, b=_b, a=_a};
        self.borderColorHLInv = {r=_r2, g=_g2, b=_b2, a=_a2};
    end
end


function ISItemDropBox:new (x, y, width, height, storeItem, target, onItemDropped, onItemRemove, onVerifyItem, onDragSelf)
    local o = ISPanel:new(x, y, width, height);
    setmetatable(o, self)
    self.__index = self
    o.x = x;
    o.y = y;
    o.background = true;
    o.backgroundColor = {r=0, g=0, b=0, a=1.0};
    o.borderColor = {r=0.4, g=0.4, b=0.4, a=1};
    o.doHighlight = true;
    o.backgroundColorHL = {r=0.2, g=0.2, b=0.2, a=1.0}; --Highlights
    o.borderColorHL = {r=0.8, g=0.8, b=0.8, a=1};
    o.doValidHighlight = true;
    o.backgroundColorHLVal = {r=0.0, g=0.2, b=0.0, a=1.0}; --Highlights
    o.borderColorHLVal = {r=0.0, g=1.0, b=0.0, a=1};
    o.doInvalidHighlight = true;
    o.backgroundColorHLInv = {r=0.2, g=0.0, b=0.0, a=1.0}; --Invalid placement Highlights
    o.borderColorHLInv = {r=1.0, g=0.0, b=0.0, a=1};
    o.width = width;
    o.height = height;
    o.anchorLeft = true;
    o.anchorRight = false;
    o.anchorTop = true;
    o.anchorBottom = false;
    o.mouseOverState = 0;
    o.boxOccupied = false;
    -- functions that can be overriden/customized
    o.functionTarget = target;
    o.onItemDropped = onItemDropped; --when items dragged under mouse are dropped in box
    o.onVerifyItem = onVerifyItem; --when items are checked to see if box can accept
    o.onDragSelf = onDragSelf; --when attempting to drag the item currently in the box
    o.onItemRemove = onItemRemove; --when rightclicking to remove item
    --end
    o.storeItem = storeItem; --store java item interally y,n?
    o.storedItem = nil; --javaobj
    o.storedItemTex = nil; --itemtex for display
    --optional stuff:
    o.doBackDropTex = false;
    o.backDropTex = nil;
    o.backDropTexCol = { r = 1, g=1, b=1, a=1 };
    --tooptil
    o.doToolTip = false;
    o.toolTipText = "";
    --toggle mouse functionallity
    o.mouseEnabled = true;
    return o
end