local basalt = require("../lib/basalt")
local libcredit = require("../lib/libcredit_mobile")

local username = ""
local main = basalt.getMainFrame()

function show_notification(status)
    local notifFrame = main:addFrame()
        :setSize(26,4)
        :setBackground(colours.grey)

    notifFrame:addButton()
        :setText("Dismiss")
        :setSize(26,1)
        :setPosition(1,4)
        :onClick(function()
            notifFrame:destroy() 
        end)

    local label = notifFrame:addLabel()

    if status then
        label:setText("Transaction successful") 
        :setPosition(4,2)
        :setBackground(colours.lime) 
        :setForeground(colours.black)
        notifFrame:setBackground(colours.lime)
    else
        label:setText("Transaction unsuccessful") 
        :setPosition(3,2)
        :setBackground(colours.red) 
        :setForeground(colours.white)
        notifFrame:setBackground(colours.red)
    end
end

local appFrame = main:addFrame()
    :setVisible(false)
    :setSize(26,19)
    :setBackground(colours.white)

local requestFrame = main:addFrame()
    :setVisible(false)
    :setSize(26,19)
    :setBackground(colours.white)


requestFrame:addLabel()
    :setText("Username: ") 
    :setPosition(2, 6)
    :setSize(10, 1)
    :setForeground(colours.black)

local request_user_input = requestFrame:addInput()
    :setPosition(12, 6)
    :setSize(12, 1)
    :setBackground(colours.lightGrey)
    :setForeground(colours.black)
    :setText("")

requestFrame:addLabel()
    :setText("Amount:   ")
    :setPosition(2, 8)
    :setSize(10, 1)
    :setForeground(colours.black)

local request_amount_input = requestFrame:addInput()
    :setPosition(12, 8)
    :setSize(12, 1)
    :setBackground(colours.lightGrey)
    :setForeground(colours.black)
    :setText("")

requestFrame:addButton()
    :setText("Request")
    :setPosition(7, 15)
    :setSize(12, 3)
    :setBackground(colours.blue)
    :setForeground(colours.white)
    :onClick(function(request_btn)
        request_btn:setBackground(colours.black)
        request_btn:setText("Pending")
        local target_usr = request_user_input:getText()
        local target_amount = request_amount_input:getText()
        target_amount = tonumber(target_amount:match("^%d+$")) 

        if not target_amount or target_amount <= 0 then
            show_notification(false)
            request_btn:setBackground(colours.blue)
            request_btn:setText("Request")
            return 
        end

        libcredit.addTransaction(target_usr, target_amount, username .. " [ecash]", username, function(successful)
            request_btn:setBackground(colours.blue)
            request_btn:setText("Request")
            show_notification(successful)
            refresh_ui()
            appFrame:setVisible(true)
            requestFrame:setVisible(false)

            if successful then
                request_amount_input:setText("")
                request_user_input:setText("")
            end
        end)
    end)

local sendFrame = main:addFrame()
    :setVisible(false)
    :setSize(26,19)
    :setBackground(colours.white)

sendFrame:addLabel()
    :setText("Recipient: ") 
    :setPosition(2, 6)
    :setSize(10, 1)
    :setForeground(colours.black)

local send_user_input = sendFrame:addInput()
    :setPosition(12, 6)
    :setSize(12, 1)
    :setBackground(colours.lightGrey)
    :setForeground(colours.black)
    :setText("")

sendFrame:addLabel()
    :setText("Amount:   ")
    :setPosition(2, 8)
    :setSize(10, 1)
    :setForeground(colours.black)

local send_amount_input = sendFrame:addInput()
    :setPosition(12, 8)
    :setSize(12, 1)
    :setBackground(colours.lightGrey)
    :setForeground(colours.black)
    :setText("")

sendFrame:addButton()
    :setText("Send") 
    :setPosition(7, 15)
    :setSize(12, 3)
    :setBackground(colours.blue)
    :setForeground(colours.white)
    :onClick(function(send_btn)
        send_btn:setBackground(colours.black)
        send_btn:setText("Pending")
        local target_usr = send_user_input:getText()
        local target_amount = send_amount_input:getText()
        target_amount = tonumber(target_amount:match("^%d+$")) 

        if not target_amount or target_amount <= 0 then
            show_notification(false)
            send_btn:setBackground(colours.blue)
            send_btn:setText("Send")
            return 
        end

        libcredit.addTransaction(username, target_amount, target_usr .. " [ecash]", target_usr, function(successful)
            send_btn:setBackground(colours.blue)
            send_btn:setText("Send")
            show_notification(successful)
            refresh_ui()
            appFrame:setVisible(true)
            sendFrame:setVisible(false)

            if successful then
                send_amount_input:setText("")
                send_user_input:setText("")
            end
        end)
    end)

local cash_label = appFrame:addBigFont()
    :setText("__G")
    :setPosition(6,2)
    :setBackground(colours.white)
    :setForeground(colours.black) 

local request_cash = appFrame:addButton()
    :setText("Request")
    :setPosition(8,10)
    :setSize(10, 3) 
    :setBackground(colours.green) 
    :setForeground(colours.white)
    :onClick(function()
        requestFrame:setVisible(true)
        appFrame:setVisible(false)
    end)

local send_cash = appFrame:addButton()
    :setText("Send")
    :setPosition(8,15)
    :setSize(10, 3) 
    :setBackground(colours.orange) 
    :setForeground(colours.white)
    :onClick(function()
        sendFrame:setVisible(true) 
        appFrame:setVisible(false)
    end)

function refresh_ui()
    libcredit.getCredit(username, function(amount)
        local amount_str = amount .. "G"
        cash_label:setText(amount_str)

        if #amount_str < 6 then
            cash_label:setPosition(6 - (#amount_str / 4) - 1,2)
        else
            cash_label:setSize(26,4)
            cash_label:setPosition(1,2)
        end
    end)
end

local login = main:addFrame()
    :setBackground(colours.grey)
    :setPosition(1,1)
    :setSize(26,19)

login:addLabel()
    :setText("Username: ")
    :setPosition(2, 3)
    :setSize(10, 1)
    :setForeground(colours.white)

local usernameInput = login:addInput()
    :setPosition(12, 3)
    :setSize(12, 1)
    :setBackground(colours.lightGrey)
    :setForeground(colours.black)
    :setText("")

local loginButton = login:addButton()
    :setText("Login")
    :setPosition(9, 15)
    :setSize(8, 3)
    :setBackground(colours.blue)
    :setForeground(colours.white)
    :onClick(function()
    
        
        username = usernameInput:getText()

        if not fs.exists("/.usrcache") then
            local file = fs.open("/.usrcache","w") 
            file.write(username)
            file.close()
        end

        login:setVisible(false)
        appFrame:setVisible(true)
        refresh_ui()
    
    end)

if fs.exists("/.usrcache") then
    local file = fs.open("/.usrcache","r")
    local username = file.readLine()
    file.close()
    usernameInput:setText(username)
end

basalt.run()