local CharUtils = {}

local datasutils = require "game.utils.datas"

local CONST = {}
CONST.EXP_MULTIPLICATOR = 4
CONST.EXP_RATIO = 5

CONST.BASE_STAT = 5
CONST.BASE_HP = 15
CONST.BASE_MP = 8

CONST.MULT_STAT = 2
CONST.MULT_HP = 7.5
CONST.SALT_HP = 35
CONST.MULT_MP = 1.5

local DIR = "characters"

function CharUtils.getBaseDirectory(lua)
  return datasutils.concatDataFolder(DIR, lua)
end

function CharUtils.getCharacterDirectory(name, lua)
  local baseDirectory = CharUtils.getBaseDirectory(lua)
  return datasutils.concatFolder(baseDirectory, name, lua)
end


function CharUtils.getExpValue(level)
  return math.floor( ( CONST.EXP_MULTIPLICATOR * ( level ^ 3 ) ) / CONST.EXP_RATIO )
end

function CharUtils.getRelativeExpValue(exp, level)
  return exp - CharUtils.getExpValue(level)
end

function CharUtils.getLevelExpRange(level)
  return CharUtils.getExpValue(level + 1) - CharUtils.getExpValue(level)
end

function CharUtils.getRemainingExp(exp, level)
  return CharUtils.getExpValue(level + 1) - exp
end

function CharUtils.getStatValue(level, base)
  return math.floor( (((base * CONST.MULT_STAT) * level)/100) ) + CONST.BASE_STAT
end

function CharUtils.getHPValue(level, base)
  return math.floor( (((CONST.SALT_HP + base * CONST.MULT_HP) * level)/100) ) + CONST.BASE_HP + level
end

function CharUtils.getPPValue(level, base)
  return math.floor( (((base * CONST.MULT_MP) * level)/100) ) + CONST.BASE_MP
end

function CharUtils.charDataExists(name)
  local dir = CharUtils.getCharacterDirectory(name, false) .. "/init.lua"
  local fileinfo = love.filesystem.getInfo(dir)
  return (fileinfo ~= nil)
end

function CharUtils.getCharacterData(charname)
  -- va eprmettre de récupérer les données d'un personnage
  local charfolder = CharUtils.getCharacterDirectory(charname, true)
  local character = datasutils.copy(charfolder)
  character.stats  = datasutils.copyDataset(charfolder, "stats")
  character.inventory   = datasutils.copyDataset(charfolder, "inventory")
  character.skills      = datasutils.copyDataset(charfolder, "skills")

  return character
end

return CharUtils
