from calendar import monthcalendar, day_name, month_name
# Pour afficher les jours et les mois en français
import locale
locale.setlocale(locale.LC_TIME,'')
import os

"""
Attributs de la classe:
---------------------
* year 							: année du calendrier

* dayname 						: style d'écriture des jours
--> trois valeurs possibles :
----- 'long' (par défaut),
----- 'short' (Initiales des jours)
----- 'abr' (trois premières lettres des jours)

* colorday 						: couleur avec laquelle les jours sont écrits
---> Valeur par défaut : 'black'

* position 						: position du nombre indiquant le jour dans les cases
---> Valeurs possibles :
----- 'center' (par défaut),
----- 'bottom left',
----- 'bottom right',
----- 'top left',
----- 'top right'

* scale 						: échelle du nombre
---> Si position = 'center', scale=4 par défaut
---> Sinon scale=2 par défaut

* opacity 						: opacité avec laquelle est écrit le nombre du jour dans les cases
---> Valeur par défaut : 0.2

* textcolor 					: couleur TiKZ avec laquelle est écrite le jour dans les cases
---> Valeur par défaut : 'gray'

* linecolor 					: couleur des traits du calendrier
---> Valeur par défaut : 'black'

* linewidth 					: épaisseur des traits de la grille
---> Valeur par défaut : '1pt'


Arguments de la méthode 'export()':
---------------------------------
* L : liste des mois à exporter.
---> Par exemple, L = [7,8] pour juillet et août.
---> Valeur par défaut : L = range(1,13)

* erase : booléen qui indique si les fichiers auxiliaires, y compris le fichier '.tex', doivent être supprimés.
---> Valeur par défaut : False

* filename : nom du calendrier
---> Valeur par défaut : filename = 'calendrier-<année>'

"""

class Calendrier:
    def __init__(self, year, dayname = 'long', colorday = 'black', position = 'center', scale = None, opacity = 0.2 , textcolor = 'gray', linecolor = 'black', linewidth = '1pt'):
        self.year = year
        self.colorday = colorday
        self.position = position
        self.scale = scale
        self.opacity = opacity
        self.textcolor = textcolor
        self.linecolor = linecolor
        self.linewidth = linewidth
                
        if dayname == 'long':
            self.days = [ i[0].upper() + i[1:] for i in day_name ]
        elif dayname == 'short':
            self.days = [ i[0].upper() for i in day_name ] # jours sous la forme 'L', 'M', ...
        elif dayname == 'abr':
            self.days = [ i[0].upper()+i[1:3] for i in day_name ] # jours sous la forme abrégée : 'Lun', 'Mar', ...
        
    def export_month(self, month):
        self.matrix = monthcalendar(self.year,month)
        
        self.tex_month = '\\begin{tikzpicture}[line width='+self.linewidth+',color='+self.linecolor+']\n\\node[below right] (head) at (0,0) { \\includegraphics[width=175mm, height=50mm]{images/"' + month_name[month] +'.png"} };\n\\node[scale=5, text=gray] at ($(head.center)+(0.1,-0.1)$) {\\bfseries ' + month_name[month] + ' ' + str(self.year) + '};\n\\node[scale=5, text=white] at (head.center) {\\bfseries ' + month_name[month] + ' ' + str(self.year) + '};\n'
        for j in range(7):
            self.tex_month += '\\node[below,outer sep=5mm, text='+self.colorday+'] at ($(head.south)+(' + str((j-3)*2.5-0.125) + ',0)$) {' + self.days[j] +'};\n'
            
            
        self.tex_month += '\\begin{scope}[shift={(0,-7)}]\n\\draw (0,0) grid[xstep = 25mm, ystep = 30mm] (7*2.5cm,-' + str(len(self.matrix)) + '*3cm);\n\\end{scope}\n'
            
        if self.position == 'center':
            if self.scale == None:
                self.scale = 4
            for line in self.matrix:
                y = -self.matrix.index( line )*3 - 8.5
                for col in line:
                    if col != 0:
                        self.tex_month += '\\node['+self.textcolor+',opacity='+str(self.opacity)+',scale='+str(self.scale)+'] at (' + str(1.25 + line.index(col)*2.5) + ',' + str(y) + ') {' + str(col) + '};\n'
                        
        elif self.position == 'top right':
            if self.scale == None:
                self.scale = 2
            for line in self.matrix:
                y = -7 - self.matrix.index( line )*3
                for col in line:
                    if col != 0:
                        self.tex_month += '\\node[below left,'+self.textcolor+',opacity='+str(self.opacity)+',scale='+str(self.scale)+'] at (' + str(2.5 + line.index(col)*2.5) + ',' + str(y) + ') {' + str(col) + '};\n'
        
        elif self.position == 'top left':
            if self.scale == None:
                self.scale = 2
            for line in self.matrix:
                y = -7 - self.matrix.index( line )*3
                for col in line:
                    if col != 0:
                        self.tex_month += '\\node[below right,'+self.textcolor+',opacity='+str(self.opacity)+',scale='+str(self.scale)+'] at (' + str(line.index(col)*2.5) + ',' + str(y) + ') {' + str(col) + '};\n'
                        
        elif self.position == 'bottom right':
            if self.scale == None:
                self.scale = 2
            for line in self.matrix:
                y = -10 - self.matrix.index( line )*3
                for col in line:
                    if col != 0:
                        self.tex_month += '\\node[above left,'+self.textcolor+',opacity='+str(self.opacity)+',scale='+str(self.scale)+'] at (' + str(2.5 + line.index(col)*2.5) + ',' + str(y) + ') {' + str(col) + '};\n'
        
        elif self.position == 'bottom left':
            if self.scale == None:
                self.scale = 2
            for line in self.matrix:
                y = -10 - self.matrix.index( line )*3
                for col in line:
                    if col != 0:
                        self.tex_month += '\\node[above right,'+self.textcolor+',opacity='+str(self.opacity)+',scale='+str(self.scale)+'] at (' + str(line.index(col)*2.5) + ',' + str(y) + ') {' + str(col) + '};\n'
        
        self.tex_month += '\\end{tikzpicture}'
        
        return self.tex_month
    
    def export(self, L = range(1,13), filename = 'calendrier-', erase = False):
        filename = filename+str(self.year)
        tex = '\\documentclass[12pt,a4paper]{article}\n\\usepackage{nopageno}\n\\usepackage[hmargin=1.75cm, vmargin=1cm]{geometry}\n\\setlength{\\parindent}{0pt}\n\\usepackage{tikz}\n\\usetikzlibrary{calc}\n'
        tex += '\\begin{document}\n'
        for month in L:
            tex += self.export_month(month)
            if month != L[-1]:
                tex += '\n\\newpage\n'
                
        tex += '\n\\end{document}'
        
        if os.path.isfile(filename+".tex"):
            os.remove(filename+".tex")
            
        fichier = open(filename+".tex","x" , encoding='utf-8')
        fichier.write(tex)
        fichier.close()
        cmd = "pdflatex  --shell-escape -synctex=1 -interaction=nonstopmode "+filename+".tex"
        os.system(cmd)
        
        if erase:
            os.remove(filename+".tex")
            os.remove(filename+".aux")
            os.remove(filename+".log")
            os.remove(filename+".synctex.gz")
        
        cmd = "START "+filename+".pdf"
        os.system(cmd)
        

C = Calendrier(2023)
"""
C.export([7]) # exporte le mois de juillet
C.export([7,8]) # exporte les mois de juillet et août
"""
C.export(erase=True) # exporte le calendrier entier de l'année