<!DOCTYPE html>

<html lang="ca">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.0/css/bulma.min.css">
    </head>
    <body>
        <style>
            .buttons.grid {
                display: flex;
                flex-direction: row;
                flex-wrap: wrap;
                
                justify-content: center;
                align-items : center;
            }

            .buttons.grid .button {
                flex: 1 0 20%;
                margin: 10px;
                padding: 40px 20px;
            }

            .buttons.grid .complex-button {
                flex: 1 0 20%;
                margin: 15px 10px;
            }
        </style>
        
        <nav class="navbar is-link">
            <div class="navbar-brand">
                <div class="navbar-item has-text-weight-bold">Traçabilitat DAFME</div>
            </div>
        </nav>
        
        <section id="section-1" class="section">
            <div class="field has-addons">
                <p class="control">
                    <button class="button">&lt;</button>
                </p>
                <p class="control">
                    <input type="date" class="button">
                </p>
                <p class="control">
                    <button class="button">&gt;</button>
                </p>
            </div>
            <div class="field has-addons">
                <p class="control">
                    <button class="button">&lt;</button>
                </p>
                <p class="control">
                    <input type="button" class="button" value="08:00 - 08:30">
                </p>
                <p class="control">
                    <button class="button">&gt;</button>
                </p>
            </div><br>

            <div id="subject-container" class="grid buttons">
                <div class="message complex-button" id="subject-1">
                    <div class="message-header">Àlgebra lineal</div>
                    <div class="message-body">
                        <div>Aula 001</div>
                        <div>08:00 - 09:00</div>
                    </div>
                </div>
                <div class="message complex-button" id="subject-2">
                    <div class="message-header">Àlgebra lineal</div>
                    <div class="message-body">
                        <div>Aula 001</div>
                        <div>08:00 - 09:00</div>
                    </div>
                </div>
                <div class="message complex-button" id="subject-3">
                    <div class="message-header">Àlgebra lineal</div>
                    <div class="message-body">
                        <div>Aula 001</div>
                        <div>08:00 - 09:00</div>
                    </div>
                </div>
                <div class="message complex-button" id="subject-4">
                    <div class="message-header">Àlgebra lineal</div>
                    <div class="message-body">
                        <div>Aula 001</div>
                        <div>08:00 - 09:00</div>
                    </div>
                </div>
                <div class="message complex-button" id="subject-5">
                    <div class="message-header">Àlgebra lineal</div>
                    <div class="message-body">
                        <div>Aula 001</div>
                        <div>08:00 - 09:00</div>
                    </div>
                </div>
            </div><br>
            
        </section>

        <section id="section-2" class="section" style="display: none;">

            <div id="letter-container" class="buttons grid">
                <button class="button" id="letter-A">A</button>
                <button class="button" id="letter-B">B</button>
                <button class="button" id="letter-C">C</button>
                <button class="button" id="letter-D">D</button>
                <button class="button" id="letter-E">E</button>
                <button class="button" id="letter-F">F</button>
                <button class="button" id="letter-G">G</button>
                <button class="button" id="letter-H">H</button>
                <button class="button" id="letter-I">I</button>
                <button class="button" id="letter-J">J</button>
                <button class="button" id="letter-K">K</button>
                <button class="button" id="letter-L">L</button>
            </div>

            <button class="button is-link" onclick="switchSection('section-1')">Torna</button>
        </section>

        <section id="section-3" class="section" style="display: none;">

            <div id="number-container" class="buttons grid">
                <button class="button" id="number-1">1</button>
                <button class="button" id="number-2">2</button>
                <button class="button" id="number-3">3</button>
                <button class="button" id="number-4">4</button>
                <button class="button" id="number-5">5</button>
                <button class="button" id="number-6">6</button>
                <button class="button" id="number-7">7</button>
                <button class="button" id="number-8">8</button>
                <button class="button" id="number-9">9</button>
                <button class="button" id="number-10">10</button>
            </div>

            <button class="button is-link" onclick="switchSection('section-2')">Torna</button>
        </section>
        <section id="section-send" class="section" style="display: none;">

            <span class="has-text-weight-bold">Assignatura:</span>
            <span id="subject-final">Àlgebra Lineal</span><br>
            <span class="has-text-weight-bold">Aula:</span>
            <span id="classroom-final">Dele</span><br>
            <span class="has-text-weight-bold">Data:</span>
            <span id="date-final">14/3/1879</span><br>
            <span class="has-text-weight-bold">Hora:</span>
            <span id="time-final">En <strong>algun moment</strong></span><br>
            <span class="has-text-weight-bold">Posició:</span>
            <span id="letter-final">P</span><span id="number-final">2</span><br><br>

            <button class="button is-link" onclick="switchSection('section-3')">Torna</button>
            <button id="send-button" class="button is-link">Envia el formulari</button><br><br>
            
            Hi ha errors? <a class="myButton" href="https://docs.google.com/forms/d/e/1FAIpQLSfT9o287VqLyhwR8LPdloAQWhuqCgA3NfdhgP5vb9_sVQHL-g/viewform">Completa el formulari manualment</a>
        </section>
        

        <script>
            // Check if user is signed in
            var api_url = "https://covid-tracability-backend-dev.sandbox.avm99963.com/api/v1/";
            fetch(api_url + "isSignedIn")
                .then(response => response.json())
                .then(data => {
                    if (!data.payload.signedIn) {
                        console.log("Not signed in!");
                        return fetch(api_url + "getAuthUrl");
                    }
                })
                .then(response => response.json())
                .then(data => {
                    // TODO: redirect here
                    // alert(data.payload.url);
                });
        </script>
        <script>
            var current_section = "section-1";

            function toggleVisibility(id) {
                var x = document.getElementById(id);
                if (x.style.display === "none") {
                    x.style.display = "block";
                } else {
                    x.style.display = "none";
                }
            }

            function switchSection(s) {
                toggleVisibility(current_section);
                toggleVisibility(s);
                current_section = s;
            }

        </script>
        <script>
            var subjects_texts = {
                "subject-1": "Àlgebra",
                "subject-2": "Càlcul I",
                "subject-3": "Topologia",
                "subject-4": "Informàtica",
                "subject-5": "Informàtica",
                "subject-6": "Informàtica",
            };
            
            function sendForm(data) {
                // Add subject to user
                fetch(api_url + "addUserSubject", {
                  "method": "POST",
                  "body": JSON.stringify({
                            subject: data["subject"]
                          }),
                  "mode": "cors",
                  "credentials": "include"
                })
                .then(res => res.json())
                .then(json => {
                  console.log("Subject added to user: ", json);
                  // TODO: Redirect to Google Forms
                  var formulari_link = "https://docs.google.com/forms/d/e/1FAIpQLSfT9o287VqLyhwR8LPdloAQWhuqCgA3NfdhgP5vb9_sVQHL-g/viewform?entry.1063142948=S03&entry.2115504093=2020-09-14&entry.1749141911=9:00&entry.1827359679=10:00&entry.208184485=Columna+3&entry.1600275159=[Autogenerat+per+delefme/covid-tracability]";
                  window.location.href = formulari_link;
                });
             }
             
             document.getElementById("send-button").addEventListener('click', function (el) {
                // TODO: emplenar això amb informació real
                sendForm({
                    "aula": "001",
                    "subject": 1,
                    "data": "16/01/2020",
                    "hora-inici": "9:00",
                    "hora-final": "10:00",
                    "seient": "7D"
                });
             });
        </script>
        <script>
            var elements = document.getElementsByClassName("button");
            Array.from(elements).forEach(function(element) {
                element.addEventListener('click', clickButton);
                element.parent = element.parentNode.id;
            });
            var elements = document.getElementsByClassName("complex-button");
            Array.from(elements).forEach(function(element) {
                element.addEventListener('click', clickButton);
                element.parent = element.parentNode.id;
            });

            function clickButton(element) {
                var parent = element.currentTarget.parent;
                var id = element.currentTarget.id;
                var final_text = (id.split("-")[0] == "subject" ? subjects_texts[id] : id.split("-")[1]);

                if (parent == "subject-container") {
                    // Canvi de background del button
                    $(".current-subject").css("background-color", "white");
                    $("#subject-container .complex-button").removeClass("is-link")
                    $("#" + id).addClass("is-link");
                    // Canvi del text al final
                    $("#subject-final").html(final_text);
                    // Canvi JSON
                    // TODO
                    // Anchor següent pregunta
                    switchSection("section-2");
                } else if (parent == "number-container") {
                    // Canvi de background del button
                    $("#number-container .button").removeClass("is-link is-light is-active")
                    $("#" + id).addClass("is-link is-light is-active");
                    // Canvi del text al final
                    $("#number-final").html(final_text);
                    // Canvi JSON
                    // TODO
                    // Anchor següent pregunta
                    switchSection("section-send");
                } else if (parent == "letter-container") {
                    // Canvi de background del button
                    $("#letter-container .button").removeClass("is-link is-light is-active")
                    $("#" + id).addClass("is-link is-light is-active");
                    // Canvi del text al final
                    $("#letter-final").html(final_text);
                    // Canvi JSON
                    // TODO
                    // Anchor següent pregunta
                    switchSection("section-3");
                }
            }
        </script>

    </body>
</html>
