from flask import Flask, request
import socket, redis, psycopg2, os
from dotenv import load_dotenv

load_dotenv()

app = Flask(__name__)

# Redis connection (cached storage)
cache = redis.Redis(host='redis', port=6379)

# Postgres Connection (persistent Storage)
mydb = psycopg2.connect(
    host="db",
    user=os.getenv('POSTGRES_USER'),
    password=os.getenv('POSTGRES_PASSWORD'),
    database=os.getenv('POSTGRES_DB')
)

mydb.set_session(autocommit=True)

@app.route("/", methods=["GET","POST"])
def home():
    # Redis counter (RAM Counter)
    visits = cache.incr("counter")

    # Postgres
    mycursor = mydb.cursor()

    # Ensures the postgres table exists
    mycursor.execute('''CREATE TABLE IF NOT EXISTS messages(
        messageID SERIAL PRIMARY KEY,
        text TEXT
        )
    ''')

    # Form submission
    if request.method == "POST":
        savedMessage = request.form["message"]
        mycursor.execute('''
        INSERT INTO messages(text) 
            Values (%s)
        ''', (savedMessage,))


    # Retrieve all stored messages
    mycursor.execute("SELECT * FROM messages")
    listMessages = mycursor.fetchall()

    message_list = ""
    for msg in listMessages:
        message_list += f"<li>{msg[1]}</li>"

    # Simple HTML response
    return f"""
    <p1>Hello from container: {socket.gethostname()} </p1>
    
    <p2>Cached Visits: {visits}</p2>

    <p3><form method="POST">
        <input name="message" placeholder="Type a message" required>
        <button type="submit">Save Message</button>
    </form></3>

    <ul>
        {message_list}
    </ul>
    """

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)