import os
from flask import Flask, request, redirect, url_for, render_template, jsonify, send_from_directory, flash
from werkzeug.utils import secure_filename
from werkzeug.security import generate_password_hash, check_password_hash
import logging
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email, EqualTo, ValidationError
from forms import RegistrationForm, LoginForm
from models import db, User
from flask_migrate import Migrate
from flask_login import LoginManager, login_user, logout_user, current_user, login_required
import requests

UPLOAD_FOLDER = '/home/ubuntu/dev/files'
log_directory = "/home/ubuntu/dev/logs"
if not os.path.exists(log_directory):
    os.makedirs(log_directory)

logging.basicConfig(filename=os.path.join(log_directory, 'dev.log'), level=logging.DEBUG)
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['SECRET_KEY'] = 'your_secret_key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://jake:Nocash01!@localhost/cons_users'

login_manager = LoginManager()
login_manager.init_app(app)

db.init_app(app)
migrate = Migrate(app, db)

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

@app.errorhandler(404)
def page_not_found(error):
    return render_template('404.html'), 404

###########################################################################
# Routes

@app.route('/blog')
def blog():
    # Fetch blog posts
    posts = fetch_blog_posts()
    return render_template('blog.html', posts=posts)

@app.route('/signup', methods=['GET', 'POST'])
def signup():
    form = RegistrationForm()
    if form.validate_on_submit():
        user = User(username=form.username.data, email=form.email.data)
        user.set_password(form.password.data)
        db.session.add(user)
        db.session.commit()
        flash('Congratulations, you are now a registered user!')
        return redirect(url_for('login'))
    return render_template('signup.html', title='Sign Up', form=form)

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()
        if user is None or not user.check_password(form.password.data):
            flash('Invalid email or password')
            return redirect(url_for('login'))
        # Log in user
        login_user(user)  # Log in the user
        flash('You are now logged in!')
        return redirect(url_for('dashboard'))  # Redirect to the appropriate page
    return render_template('login.html', title='Log In', form=form)

@app.route('/logout')
def logout():
    logout_user()  # Log out the user
    flash('You have been logged out')
    return redirect(url_for('index'))  # Redirect to the homepage or another appropriate page

@app.route('/dashboard')
@login_required  # Ensure that only logged-in users can access this route
def dashboard():
    return render_template('dashboard.html', title='Dashboard', user=current_user)

@app.route('/reset_password', methods=['GET', 'POST'])
def reset_password():
    if request.method == 'POST':
        # Process the form submission to send password reset instructions
        email = request.form.get('email')
        # Implement logic to send password reset instructions to the user's email
        flash('Instructions to reset your password have been sent to your email.')
        return redirect(url_for('login'))
    return render_template('reset_password.html')

@app.route('/', methods=['GET', 'POST'])
def home():
    return render_template('index.html')

@app.route('/index', methods=['GET', 'POST'])
def index():
    return render_template('index.html')
if __name__ == '__main__':
    db.create_all()
    app.run(debug=True)

##############################################################################
# Regular functions

def fetch_blog_posts():
    # Replace 'your_wordpress_url' with the URL of your WordPress site
    url = 'https://florynce.wordpress.com/wp-json/wp/v2/posts'
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        return None
