from flask import Flask, render_template, request, redirect, url_for, flash, session
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequired
from functools import wraps
import os
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'  # Change this to a random string

# Database configuration - update with your friend's database info
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///logs.db'  # Change this to match your friend's DB
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

# Simple log model - adjust to match your friend's database structure
class Log(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    action = db.Column(db.String(100), nullable=False)
    timestamp = db.Column(db.DateTime, default=datetime.utcnow)
    
    def __repr__(self):
        return f"Log('{self.action}', '{self.timestamp}')"

# Keep your existing user dictionary for authentication
users = {
    "admin": {"password": "admin123", "role": "admin"},
    "user": {"password": "user123", "role": "user"}
}

# Add a function to create a new log entry
def add_log(action):
    log = Log(action=action)
    db.session.add(log)
    db.session.commit()

class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    remember = BooleanField('Remember Me')

class GateControlForm(FlaskForm):
    open_gate = SubmitField('Open Gate')
    close_gate = SubmitField('Close Gate')
    check_camera = SubmitField('Check Camera')
    debug_mode = BooleanField('Debug Mode')

def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if 'logged_in' not in session:
            return redirect(url_for('login'))
        return f(*args, **kwargs)
    return decorated_function

def admin_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if 'role' not in session or session['role'] != 'admin':
            flash('You need to be an admin to access this page.')
            return redirect(url_for('login'))
        return f(*args, **kwargs)
    return decorated_function

@app.route('/')
def index():
    if 'logged_in' in session:
        if session['role'] == 'admin':
            return redirect(url_for('dashboard'))
        return redirect(url_for('user_page'))
    return redirect(url_for('login'))

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    error = None
    
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        
        if username in users and users[username]['password'] == password:
            session['logged_in'] = True
            session['username'] = username
            session['role'] = users[username]['role']
            
            # Log the login action
            add_log(f"User {username} logged in")
            
            if users[username]['role'] == 'admin':
                return redirect(url_for('dashboard'))
            else:
                return redirect(url_for('user_page'))
        else:
            # Log the failed login attempt
            add_log(f"Failed login attempt for user {username}")
            error = 'Invalid credentials. Please try again.'
    
    return render_template('inlog.html', form=form, error=error)

@app.route('/dashboard', methods=['GET', 'POST'])
@login_required
@admin_required
def dashboard():
    form = GateControlForm()
    gate_status = "Closed"
    camera_status = "Inactive"
    debug_mode = False
    
    # Get the most recent logs to display
    recent_logs = Log.query.order_by(Log.timestamp.desc()).limit(10).all()
    
    if form.validate_on_submit():
        if form.open_gate.data:
            gate_status = "Open"
            add_log("Gate opened by " + session['username'])
        elif form.close_gate.data:
            gate_status = "Closed"
            add_log("Gate closed by " + session['username'])
        elif form.check_camera.data:
            camera_status = "Active"
            add_log("Camera checked by " + session['username'])
        
        debug_mode = form.debug_mode.data
        if debug_mode:
            add_log("Debug mode enabled by " + session['username'])
    
    return render_template('dashboard.html', form=form, gate_status=gate_status, 
                           camera_status=camera_status, debug_mode=debug_mode,
                           recent_logs=recent_logs)

@app.route('/user')
@login_required
def user_page():
    add_log(f"User {session['username']} accessed user page")
    return "Regular user page - Access restricted"

@app.route('/logout')
def logout():
    if 'username' in session:
        add_log(f"User {session['username']} logged out")
    session.clear()
    return redirect(url_for('login'))

# Initialize database
with app.app_context():
    db.create_all()

if __name__ == '__main__':
    app.run(debug=True)