from flask import Flask, render_template, request, redirect, session
import sqlite3
import sys
from app import app

database = 'webstore.db'

def generate_csrf_token():
    if 'csrf_token' not in session:
        session['csrf_token'] = str(random.randint(1000, 9999))
    return session['csrf_token']

### Implementing fix for CSRF:
# def check_csrf():
#   if session["csrf_token"] != request.form["csrf_token"]:
#       return False
###

@app.route('/')
def index():
    if 'username' in session:
        return redirect('/store')
    else:
        return redirect('/login')

@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
### Implementing a fix for the cryptographic failures:
#        salt = bcrypt.gensalt()
#        password = bcrypt.hashpw(password.encode('utf-8'), salt)
###

### Implementing a fix for the identification and authentication failures:
#       if len(username) < 6:
#           return "Error: Username must be at least 6 characters long."
#       if len(password) < 8:
#           return "Error: Password must be at least 8 characters long."
#       if password.isalpha() or password.isdigit():
#           return "Error: Password must contain a combination of letters and numbers."
###
        connection = sqlite3.connect(database)
        cursor = connection.cursor()

        cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
        existing_user = cursor.fetchone()

        if existing_user:
            return render_template('register.html', error='Username already taken')

### Implementing fix for broken access control:
#        cursor.execute("INSERT INTO users (username, password, guest) VALUES (?, ?, ?)",
#                      (username, password, guest))
###

        cursor.execute("INSERT INTO users (username, password) VALUES (?, ?)",
                       (username, password))
        connection.commit()

        connection.close()

        return redirect('/login')

    return render_template('register.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']

### Implementing a fix for the SQL injection vulnerability.
#    conn = sqlite3.connect('database.db')
#    cursor = conn.cursor()
#    query = "SELECT * FROM users WHERE username = ? AND password = ?"
#    cursor.execute(query, (username, password))
###

        # SQL injection vulnerability
        db = sqlite3.connect(database)
        cursor = db.cursor()

        query = "SELECT * FROM users WHERE username = '{}' AND password = '{}'".format(username, password)
        user = db.execute(query)

        if user:
            session['username'] = username
            return redirect('/store')
        else:
            return render_template('login.html', error='Invalid username or password')

    return render_template('login.html')

# Store page
@app.route('/store')
def store():
    if 'username' in session:
        connection = sqlite3.connect(database)
        cursor = connection.cursor()
        cursor.execute("SELECT id, name, price FROM Products")
        products = cursor.fetchall()
        connection.close()
        products = list(products)
        return render_template('store.html', username=session['username'], products=products)
    return redirect('/login')

@app.route('/cart')
def cart():
    if 'username' in session:
        connection = sqlite3.connect(database)
        cursor = connection.cursor()

        cursor.execute("SELECT * FROM History WHERE username = ?", (session['username'],))
        cart_items = cursor.fetchall()

        connection.close()

        return render_template('cart.html', username=session['username'], cart=cart_items)

    return redirect('/login')

@app.route('/add_to_cart/<int:product_id>')
def add_to_cart(product_id):
    if 'username' in session:
        connection = sqlite3.connect(database)
        cursor = connection.cursor()

        cursor.execute("SELECT * FROM Products WHERE id = ?", (product_id,))
        product = cursor.fetchone()

        if product:
            cursor.execute("INSERT INTO History (username, product_name, price) VALUES (?, ?, ?)",
                           (session['username'], product[1], product[2]))
            connection.commit()

        connection.close()

    return redirect('/store')

# Missing CSRF token validation
@app.route('/remove_from_cart/<int:item_id>')
def remove_from_cart(item_id):
    if 'username' in session:
        connection = sqlite3.connect(database)
        cursor = connection.cursor()

        cursor.execute("DELETE FROM History WHERE id = ?", (item_id,))
        connection.commit()

        connection.close()

    return redirect('/cart')

@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect('/login')

@app.route('/admin')
def admin():
### Implementing fix for broken access control:
#    if 'admin' in session:
#        return render_template('admin.html')
#    else:
#        return render_template('/')
###
    return render_template('admin.html')

@app.route('/admin/add_product', methods=['POST'])
def add_product():
    name = request.form['product_name']
    price = request.form['price']

    connection = sqlite3.connect(database)
    cursor = connection.cursor()

    cursor.execute("INSERT INTO Products (name, price) VALUES (?, ?)",
                   (name, price))
    connection.commit()

    connection.close()

    return redirect('/admin')

@app.route('/checkout')
def checkout():
    if 'username' in session:
        connection = sqlite3.connect(database)
        cursor = connection.cursor()

        cursor.execute("DELETE FROM History")
        connection.commit()

        connection.close()
        return redirect('/store')