from random import *
import sys,os,math,shutil,json

def ex_sql(db_name,request,replace=""):
    conn = sqlite3.connect(db_name)
    conn.row_factory=sqlite3.Row # La fonction retourne des dicos et pas des listes
    cur = conn.cursor()
    if not replace=="":
        cur.execute(request,replace)
    else:
        cur.execute(request)
    conn.commit()
    a = None
    if "SELECT" in request.upper():
        a = cur.fetchall()
        for i in range(len(a)):
            a[i] = dict(a[i]) # Convertir les dicos sqlite3 en dico classiques python
    cur.close()
    conn.close()
    return a

def drawcenter(game,surface,posx,posy):
    # Dessine une surface depuis son centre, et non son coin en haut à gauche
    game.window.blit(surface,(round(posx-surface.get_width()/2),round(posy-surface.get_height()/2)))

def blit_text(pygame,surface, text, pos, font, color=[255]*4,center=False):
    words = [word.split(' ') for word in text.splitlines()]  # Liste qui contient tout les mots
    colors = {"[orange]":[202,67,0],"[violet]":[202,0,202],
            "[vert]":[33,202,0],"[rouge]":[246,0,0],"[bleu]":[0,0,255],
            "[cyan]":[0,200,200]
            }
    ''' contact : Orange
        distance : Violet
        taunt : Bleu
        soin : Vert
        attaque : Rouge
        joueur : Cyan
    '''

    space = font.size(' ')[0]  # La largeur d'un espace
    max_width, max_height = surface.get_size()
    x, y = pos
    linebreak = False
    linesurf = pygame.Surface(surface.get_size(),pygame.SRCALPHA)
    for line in words:
        if linebreak:
            px = 0
            if center:
                px = (surface.get_width()-x+space)//2
            surface.blit(linesurf,(px,0))
            linesurf.fill([0]*4)
            x=pos[0]
            y+=font.size(' ')[1]
            linebreak = False
        for word in line:
            col = color
            for j in colors.keys():
                if word.find(j)==0:
                    col = colors[j]
                    word = word[word.find(j)+len(j):]
            word_surface = font.render(word,False,col)
            word_width = word_surface.get_width()
            if x+word_width>surface.get_width():
                px = 0
                if center:
                    px = (surface.get_width()-x+space)//2
                surface.blit(linesurf,(px,0))
                linesurf.fill([0]*4)
                x=pos[0]
                y+=font.size(' ')[1]
            linesurf.blit(word_surface,(x,y))
            x+=word_width+space
        linebreak = True
        px = 0
        if center:
            px = (surface.get_width()-x+space)//2
        surface.blit(linesurf,(px,0))
        linesurf.fill([0]*4)
        x=pos[0]
        y+=font.size(' ')[1]

class Timer(): # Mannière de gerer les timers pour des espaces de temps flottants
    def __init__(self,maxcount):
        self.maxcount = maxcount
        self.timer = maxcount
        self.loops = 0
    def tick(self,avancement):
        result = self.timer<=0
        self.timer-=avancement
        if result:
            self.timer+=self.maxcount
            self.loops+=1
        return result
    def getloops(self):
        return self.loops
    def getmax(self):
        return self.maxcount
    def getratio(self):
        return max(min(1,self.timer/self.maxcount),0)
    def reset(self):
        self.timer = self.maxcount
    def add(self,amount):
        self.timer+=amount
        self.maxcount+=amount

def get_save_dir(dirname):
    path = ""
    p = sys.platform
    if p=="linux":
        path = os.environ["HOME"]+"/.local/share/"+dirname
    if p=="win32":
        path = os.getenv('APPDATA')+"\\"+dirname

    # Je crée le dossier s'il n'existe pas
    try:
        os.mkdir(path)
    except:
        pass

    return path