#! /usr/bin/env python3

import cgi
import json
import datetime
import html

def handle_fields():
    form = cgi.FieldStorage()

    name = form.getvalue("name")
    url = form.getvalue("url")
    message = form.getvalue("message")

    # Nothign was submitted.
    if name is None and url is None and message is None:
        return ""

    if name is None:
        return "<p>name is required</p>"
    elif message is None:
        return "<p>please write a silly something (:</p>"

    url = "" if url is None else url

    # Make the names safe.
    name = html.escape(name)
    url = html.escape(url)
    message = html.escape(message)

    guest_book = []

    # Open data if already there.
    try:
        with open("guest_book.json", "r")  as fp:
            guest_book = json.load(fp)
    except FileNotFoundError:
        pass

    # Already in list.
    for guest in guest_book:
        if guest["name"] == name and guest["url"] == url and guest["message"] == message:
            return "<p>You already been added</p>"

    date = datetime.datetime.now()
    guest_entry = {"name": name, "url": url, "message": message, "date": date.strftime("%B, %d %Y")}

    # Dump guest to file.
    with open("guest_book.json", "w") as fp:
        guest_book.append(guest_entry)
        json.dump(guest_book, fp, indent=4)

    return "<p>You been added to the guest book yippe (:</p><img src=\"../images/yippee.gif\" alt=\"yippee!\"/>"

def get_guest_html_from_list():
    guest_html = ""

    try:
        with open("guest_book.json", "r")  as fp:
            for guest in json.load(fp)[::-1]:
                guest_table = """
                    <table border="1" width="60%">
                        <tr>
                            <td>
                                <b>{name}</b> <a href="{url}" target="_blank">{url}</a> --- signed {date}
                            </td> 
                        </tr>

                        <tr>
                            <td><p>{message}</p></td>
                        </tr>
                    </table>
                """

                guest_table = guest_table.format(name=guest["name"], url=guest["url"],
                    date=guest["date"], message=guest["message"])
                guest_html += guest_table
    except FileNotFoundError:
        guest_html =  """
            <table border="1" width="60%">
                <tr>
                    <td>
                        <p>No guest have been added ): But you can be the first!</p>
                    </td>
                </tr>
            </table>
        """

    return guest_html

def display_html(fields_reponse):
    print("Content-Type: text/html")
    
    html_text = """
        <!DOCTYPE html>
        <html>
        
        <head>
            <title>Guest Book</title>

        <style>
            
        body {{
            color: black;
            background-image: url('../images/guest_book_background.png');
        }}

        table {{
            color: black;
            background-color: #bebebe;
            margin-top: 10px;
            margin-bottom: 10px;
            margin-left: 10px;
            margin-right: 10px;
        }}

        </style>
        </head>

        <body>
            <a href="../index.html"><img src="../images/back_home.png" alt="Back to home page"/></a>
            
            <center>
                <table border="1" width="60%">
                    <tr>
                        <td>
                            <h3>Sign my fucking guest book</h3>
                            <form action = "guest_book.cgi" method = "get">
                                <lable for = "name" maxlength="100">Name</lable>
                                <input type = "text" name = "name"/>
                                <br/>
                                <lable for = "url" maxlength="256">Website (Optional)</lable>
                                <input type = "text" name = "url"/>
                                <br/><br/>
                                <lable for = "message">Write a little silly something</lable>
                                <br/>
                                <textarea type = "text" name = "message" rows = "4" cols = "40" maxlength="512"></textarea>
                                <br/>
                                <input type = "submit" value = "Fucking submit"> <b>You can't delete/edit it afterwards</b>
                            </form>
                            <p>
                                <b>Be nice! Dont be a fucking ass.</b>
                            </p>
                            {fields_reponse}
                        </td>
                    </tr>
                </table>

            {guest_html}
            </center>
        </body>
        </html>
    """
    
    html_text = html_text.format(
        fields_reponse=fields_reponse,
        guest_html=get_guest_html_from_list()
    )

    print(html_text)

fields_reponse = handle_fields()
display_html(fields_reponse)