from flask import(
		Blueprint, flash, g, redirect, render_template, request, url_for
)
from werkzeug.exceptions import abort

from flaskr.auth import login_required
from flaskr.db import get_db
from flask_paginate import Pagination, get_page_args

bp = Blueprint('blog', __name__)

@bp.route('/')
def index():
	page = request.args.get('page', type=int, default=1)
	db = get_db()
	per_page = 5 

	posts = db.execute(
		'SELECT p.id, title, body, created, author_id, username'
		' FROM post p JOIN user u ON p.author_id = u.id'
		' ORDER BY created DESC  limit {}, {};'.format((page-1)*per_page, per_page)
	).fetchall()
	
	posts2 = db.execute(
			'select * from post p join user u on p.author_id = u.id'
	).fetchall()

	total_page = len(posts2) 
    
	pagination = Pagination(page=page, per_page=per_page)
	return render_template('blog/index.html', posts=posts, per_page=per_page, total_page=total_page, pagination=pagination)

@bp.route('/create', methods=('GET', 'POST'))
@login_required
def create():
	if request.method == 'POST':
		title = request.form['title']
		body = request.form['body']
		error = None

		if not title:
			error = 'Title is required.'
		
		if error is not None:
			flash(error)
		else:
			db = get_db()
			db.execute(
				'INSERT INTO post (title, body, author_id)'
				' VALUES (?, ?, ?)',
				(title, body, g.user['id'])
			)
			db.commit()
			return redirect(url_for('blog.index'))
	
	return render_template('blog/create.html')

def get_post(id, check_author=True):
	post = get_db().execute(
		'SELECT p.id, title, body, created, author_id, username'
		' FROM post p JOIN user u ON p.author_id = u.id'
		' WHERE p.id = ?',
		(id,)
		
	).fetchone()

	if post is None:
		abort(404, f"Post id {id} doesn't exist.") 
	
	if check_author and post['author_id'] != g.user['id']:
		abort(403)

	return post

@bp.route('/<int:id>/update', methods=('GET', 'POST'))
@login_required
def update(id):
	post = get_post(id)

	if request.method == 'POST':
		title = request.form['title']
		body = request.form['body']
		error = None

		if not title:
			error = 'Title is required.'

		if error is not None:
			flash(error)
		else:
			db = get_db()
		db.execute(
			'UPDATE post SET title = ?, body = ?'
			' WHERE id = ?',
			(title, body, id)
		)
		db.commit()
		return redirect(url_for('blog.index'))
	return render_template('blog/update.html', post=post)

@bp.route('/<int:id>/delete', methods=('POST',))
@login_required
def delete(id):
	get_post(id)
	db = get_db()
	db.execute('DELETE FROM post WHERE id = ?', (id,))
	db.commit()
	return redirect(url_for('blog.index'))
	
