--Main fit find function
local R = require "rclient"
local r = R.connect()

local T = {}
T.types = { M="Magicka", S="Stamina", U="Ulitmate"}
function T:getFitData(data)

    --Construct arrays from data
    local mainstat_array = {}
    local power_array = {}
    local value_array = {}
    local health_array = {}
    local type = "Unknown"
    for k,v in pairs(data) do
        local msu, primary, power, health = k:match("([MSU])([0-9.]+)P([0-9.]+)H?([0-9.]+)?")
        table.insert(mainstat_array, tonumber(primary))
        table.insert(power_array, tonumber(power))
        table.insert(health_array, tonumber(health) or 0)
        table.insert(value_array, tonumber(v))
        type = self.types[msu] or "Unknown"
    end

    --Import data to R
    r["Mainstat"] = mainstat_array
    r["Power"] = power_array
    r["Values"] = value_array
    r["Health"] = health_array

    --First check if it's actually constant
    r("valconst <- max(Values) == min(Values)")
    if r["valconst"][1] then
        return {
            main=0,
            power=0,
            int=value_array[1],
            rsq=1,
            const=true,
        }
    else
        --Get linear fit
        r("fit <- lm(Values ~ Mainstat + Power + Health)")
        r("details <- summary(fit)")

        --Export results from R
        local coef = r["fit$coefficients"]
        local rsq = r["details$r.squared"]

        --Construct result output
        return {
            main=coef.Mainstat,
            power=coef.Power,
            health=coef.Health,
            int=coef["(Intercept)"],
            rsq=rsq[1],
            const=false,
            type=type,
        }
    end
end

function T:replaceNumberInDescription(str, needle, formulaSig)
    local check,f = str:find(needle)
    if check==nil then return str end
    local first = str:sub(1,f)
    local last = ""
    if #str > f then
        last = str:sub(f+1,-1)
    end
    return first:gsub(needle, formulaSig) .. last
end

function T:initSkillData(sv)
    if self.skillref then return self.skillref end
    self.skillref = {}
    local skillfull = sv:getSVEntry("SkillsFullInfo")
    for type,lines in pairs(skillfull) do
        for line,skills in pairs(lines) do
            for skill in pairs(skills) do
                self.skillref[skill] = { type=type, line=line }
            end
        end
    end
    return self.skillref
end

return T