#!/usr/bin/env python3

from openpyxl import Workbook
from openpyxl import load_workbook
import sys
import os



def escape_latex (content):
    content=content.replace("⁄","/")
    content=content.replace("℔", "\ lb")
    content=content.replace("½", "$\\frac{1}{2}$")
    content=content.replace("¼", "$\\frac{1}{4}$")
    content=content.replace("¾", "$\\frac{3}{4}$")
    content=content.replace("\n", "\\\\\n")
    content=content.replace("°", "$^\circ$")
    content = content.replace("&", "\&")
    content = content.replace("ö", "ö")
    return content


# Define output file
f_latex = open("rezepte.tex","w+")

# Load cookbook
cb = load_workbook('/home/sebastian/Projekte/Kochbuch/kekse.xlsx', data_only=1)

sheets = cb.sheetnames

ws = None


# Find worksheet with recipes
ws = cb.get_sheet_by_name("Rezepte")

# Variables to store information while parsing

# Legend gives the column with descriptions and starting row for the recipes
legend_row = 0
legend_col = 0

# Ingredients
# Find the corresponding rows to all properties of recipes 
ingredients_row_start = 0

in_ingredients = False
in_recipe = False

ingredients = {}
ingredients_unit = {}
ingredients_comment = {}

ingredients_other_row = 0 


# Other fields
type_row = 0
instructions_row = 0
baking_time_row = 0
baking_temperature_row = 0
number_row = 0
resting_time_row = 0
specials_row = 0

# Years
first_year_row = 0
last_year_row = 0
first_year = 0

#####

# Go through worksheet and parse all information
for column in ws.columns:
    for cell in column:

        # Find row of type of recipe
        if(cell.value=="Art"):
            type_row = cell.row
            legend_row = cell.row
            legend_col = cell.column

        if(cell.column == legend_col):
            # Find row of recipe name, this is in the row with 'Zutaten'
            if(cell.value == "Zutaten"):
                name_row = cell.row
                ingredients_row_start = cell.row +1
                in_ingredients = True


            # Find position of ingredients
            if(cell.value == "Hauptaromen"):
                aroma_row = cell.row

            # Find position of source
            if(cell.value == "Quelle"):
                source_row = cell.row

            # Instructions
            if(cell.value== "Anleitung"):
                instructions_row = cell.row

            # Check if we are at end of ingredients
            if(cell.value== "Sonstiges (Deko)"):
                ingredients_other_row = cell.row
                in_ingredients = False

            # Make list of all ingredients and their units
            if(cell.row >= ingredients_row_start and in_ingredients):
                string = cell.value

                if("(" in string and ")" in string):
                    ingredients[cell.row] = (cell.value.split('(')[0].rstrip())
                    ingredients_unit[cell.row] = (cell.value.split('(')[1].split(')')[0].rstrip())
                    ingredients_comment[cell.row] = (cell.value.split(')')[1].rstrip())
                else:
                    ingredients[cell.row] = (string)
                    ingredients_unit[cell.row] = ("")
                    ingredients_comment[cell.row] = ("")


            # Further instructions
            if(cell.value== "Backzeit (Minuten)"):
                baking_time_row = cell.row
            if(cell.value== "Backtemperatur Umluft (Grad)"):
                baking_temperature_row = cell.row
            if(cell.value== "Ruhezeit (Minuten)"):
                resting_time_row = cell.row
            if(cell.value== "Anzahl (ca.)"):
                number_row = cell.row
            if(cell.value== "Besonderheiten"):
                specials_row = cell.row

            # Years
            if(cell.value == 2013):
                first_year_row = cell.row
                last_year_row = cell.row
                first_year = 2013

            if(first_year_row > 0 and cell.value == "Kommentare zur Bearbeitung."):
                # cell.row -2 instead of -1 to ignore current year 2021
                last_year_row = cell.row-2
        
        # By now, we should have found everything in the legend
      
        
    #####

    # Parse recipe
    # Go through worksheet vertically, starting with the first column
    # If right of legend, then it must be a recipe
    if(cell.column > legend_col):

        # Obtain information of recipe in the right order, so that we can directly write it to the tex-file.

        # Name of recipe
        content = (ws._get_cell(name_row, cell.column).value)
        if(content != "None\n" and content != None):
            f_latex.write(str("\\begin{minipage}{\\textwidth}\n"))

            #if (content[-5:]=="(Oma)"):
            #    content="Omas " + content[:-6]
            f_latex.write(str("\section{%s}\\vspace{0.5cm}\n" % content))

            f_latex.write(str("\\begin{tabular}{lll}\n"))

            # Aroma
            content = (ws._get_cell(aroma_row, cell.column).value)
            if(content != "None\n" and content != None):
                f_latex.write(str("\\faHeart & \\textbf{Hauptzutat} & %s" % content))
                
                f_latex.write(str("\\index{\\textbf{%s}}" % content.replace(", ", "}} \\index{\\textbf{")))
                f_latex.write("\\\\\n")

            # Type
            content = (ws._get_cell(type_row, cell.column).value)
            if(content != "None\n" and content != None):
                f_latex.write(str("\\faEye & \\textbf{Form} & %s" % content))
                f_latex.write(str("\\index[formen]{\\textbf{%s}}" % content.replace(", ", "}} \\index[formen]{\\textbf{")))
                f_latex.write("\\\\\n")

            # Source
            content = (ws._get_cell(source_row, cell.column).value)
            if(content != "None\n" and content != None):
                f_latex.write(str("\\faBook & \\textbf{Quelle} & %s" % content))
                f_latex.write("\\\\\n")            

            # Specials
            content = (ws._get_cell(specials_row, cell.column).value)
            if content == "(vegan)":
                content="Vegan"
            if(content != "None\n" and content != None):
                f_latex.write(str("\\faStar & \\textbf{Besonderheiten} & %s" % content))
                f_latex.write("\\\\\n") 

            # Baking
            content1 = str(ws._get_cell(baking_time_row, cell.column).value)
            content2 = str(ws._get_cell(baking_temperature_row, cell.column).value)

            if((content1 != "None" and content1 != None and content1 != "0") or (content2 != "None" and content2 != None and content2 != "0")):
                f_latex.write(str("\\Oven & \\textbf{Backzeit} &"))
                if(content1 != "None" and content1 != None and content1 != "0"):
                    if(content1[-4:]=="Min."):
                        content1 = content1[:-4]
                    f_latex.write(str("%s Minuten bei " % content1))
                else:
                    f_latex.write(str(" bei"))
                if(content2 != "None" and content2 != None and content2 != "0"):
                    f_latex.write(str(" %s~$^\circ$C" % content2))
                f_latex.write("\\\\\n")

            # Resting time
            content = str(ws._get_cell(resting_time_row, cell.column).value)
            if(content != "None" and content != None and content != "0"):
                f_latex.write(str("\\faClockO & \\textbf{Ruhezeit} &"))
                if(content[-1:]=="h"):
                    f_latex.write(str(" %s Stunden" % content[:-1]))
                else:
                    f_latex.write(str("%s Minuten" % content))
                f_latex.write("\\\\\n")

            # Amount
            content = (ws._get_cell(number_row, cell.column).value)
            if(content != "None\n" and content != None):
                f_latex.write(str("\\faHashtag & \\textbf{Anzahl} & %s Stück\\\\\n" % content))

            # Years
            year = first_year
            count = 0
            output = "\\faCalendar & \\textbf{Gebacken} &"
            for i in range (first_year_row, last_year_row+1):
                content = (ws._get_cell(i, cell.column).value)
                if(content != "None\n" and content != None):
                    # Cookie was baked in year
                    output = output + " " + str(year) + ","
                    count +=1
                year += 1
            if(count == 0):
                output = output + " Noch nie gebacken"
            else:
                output = output[:-1]
            f_latex.write(str(output+"\\\\\n"))

            if(count > 0):
                f_latex.write(str("\\faLineChart & \\textbf{Häufigkeit} & " + str(round(100/(year-first_year)*count))+"\\%\\\\\n"))

            f_latex.write(str("\\end{tabular}\n"))



            # List of Ingredients
            f_latex.write(str("\\subsection*{Zutaten}\n"))

            f_latex.write(str("\\begin{compactitem}\n"))
            for i in range (ingredients_row_start, ingredients_other_row):
                content = str(ws._get_cell(i, cell.column).value)
                if(content != "None\n" and content != None and content != "None"):

                    #content = content + ingredients_unit[i-ingredients_row_start] + ingredients[i-ingredients_row_start]
                    
                    # Add unit and whitespaces if needed
                    if (ingredients_unit[i] !="g"):
                        content = content + " "
                    if (ingredients_unit[i] != ""):
                        content = content + ingredients_unit[i] + " "
                    
                    # Add Ingredient name
                    if (ingredients[i] == "Ei"):
                        if(content == "1 "):
                            content = content + "Ei"
                        else:
                            content = content + "Eier"
                    else:
                        content = content + ingredients[i]
                    # Add comment if available
                    if(ingredients_comment[i] != ""):
                        content = content + "; " + ingredients_unit[i]

                    content=escape_latex(content)

                    f_latex.write(str("\\item %s \n") % content)

            f_latex.write(str("\\end{compactitem}\n\\vspace{0.2cm}\n"))

            # Other ingredients
            content = (ws._get_cell(ingredients_other_row, cell.column).value)
            
            if(content != "None\n" and content != None and content != "None"):
                content = escape_latex(content)
                f_latex.write("\\textit{Außerdem:} %s \n" % content) 


            # Instructions
            content = (ws._get_cell(instructions_row, cell.column).value)
            if(content != "None\n" and content != None):
                content=escape_latex(content)

                f_latex.write(str("\\subsection*{Anleitung} %s\n" % content))
        
            f_latex.write(str("\\end{minipage}\n\n"))
            f_latex.write(str("\\vspace{2cm}\n"))




# That's all, so close files
f_latex.close()

os.system("latexmk -pdf main.tex")
