from flask import Flask, render_template, redirect, url_for, request
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
import requests
from bookapp.config import Config


MOVIE_DB_SEARCH_URL = "https://api.themoviedb.org/3/search/movie"
MOVIE_DB_INFO_URL = "https://api.themoviedb.org/3/movie"
MOVIE_DB_IMAGE_URL = "https://image.tmdb.org/t/p/w500"

API_KEY = Config.TMDB_API_KEY # this may not be correct
GOOGLE_API_KEY= Config.GOOGLE_API_KEY


db = SQLAlchemy()

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(Config)
    Bootstrap(app)
    db.init_app(app)

    # app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///books-collection.db"

    # create table
    class Movie(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String, nullable=False)
        year = db.Column(db.Integer(), nullable=False)
        description = db.Column(db.String, nullable=False)
        rating = db.Column(db.Float, nullable=True)
        ranking = db.Column(db.Integer, nullable=True)
        review = db.Column(db.String, nullable=True)
        img_url = db.Column(db.String, nullable=False)


    with app.app_context():
        db.create_all()    

    ## Single test db entry
    # new_movie = Movie(
    #     title="Phone home ",
    #     year=2013,
    #     description="Publicist Stuart Shepard finds himself trapped in a phone booth, pinned down by an extortionist's sniper rifle. Unable to leave or receive outside help, Stuart's negotiation with the caller leads to a jaw-dropping climax.",
    #     rating=7.3,
    #     ranking=10,
    #     review="My favourite character was the caller.",
    #     img_url="https://image.tmdb.org/t/p/w500/tjrX2oWRCM3Tvarz38zlZM7Uc10.jpg"
    #     )

    # with app.app_context():
    #     db.session.add(new_movie)
    #     db.session.commit()

    class RateMovieForm(FlaskForm):
        rating = StringField("Your rating")
        review = StringField("Your review")
        submit = SubmitField("Done")

    class AddMovieForm(FlaskForm):
        title = StringField("Your Book Title", validators=[DataRequired()])
        submit = SubmitField("Add Book")

    @app.route("/")
    def home():
        # all_movies = db.session.execute(db.select(Movie).order_by(Movie.rating)).scalars()
        all_movies = Movie.query.order_by(Movie.rating).all()
        for i in range(len(all_movies)):
            all_movies[i].ranking = len(all_movies) - i 
        db.session.commit()
        return render_template("index.html", movies=all_movies)

    @app.route("/edit", methods=["GET", "POST"])
    def rate_movie():
        form = RateMovieForm()
        movie_id = request.args.get("id")
        movie = Movie.query.get(movie_id)
        if form.validate_on_submit():
            movie.rating = float(form.rating.data)
            movie.review = form.review.data
            db.session.commit()
            return redirect(url_for('home'))
        return render_template("edit.html", movie=movie, form=form)

    @app.route("/delete")
    def delete():
        movie_id = request.args.get('id')
        movie_to_delete = Movie.query.get(movie_id)
        db.session.delete(movie_to_delete)
        db.session.commit()
        return redirect(url_for('home'))


    # def movie_search(name):
    #     url = f' https://api.themoviedb.org/3/search/movie?api_key={API_KEY}&language=en-US&query={name}%22&page=1&include_adult=false'
    #     data = ((requests.get(url=url)).json())['results']
    #     return (data)

    def movie_search(name):
        url = f'https://www.googleapis.com/books/v1/volumes'
        params = {
            'q': name,
            'key': GOOGLE_API_KEY,
            "maxResults": 5,
        }

        response = requests.get(url, params=params)
        # data = response.json()['items'][0]['volumeInfo']
        data = response.json()['items']
        return data

    @app.route("/add", methods=["GET", "POST"])
    def add():
        form = AddMovieForm()
        if form.validate_on_submit():
            movie_title = form.title.data
            movies = movie_search(name=movie_title)
            return render_template('select.html', movies=movies)
        return render_template("add.html", form=form)


    @app.route("/find")
    def find_movie():
        movie_api_id = request.args.get("id")
        if movie_api_id:
            # movie_api_url = f"{MOVIE_DB_INFO_URL}/{movie_api_id}"
            movie_api_url = f"https://www.googleapis.com/books/v1/volumes/{movie_api_id}"
            response = requests.get(movie_api_url, params={"api_key": GOOGLE_API_KEY})
            data = response.json()
            new_movie = Movie(
                title=data['volumeInfo']['title'],
                year=data['volumeInfo']['publishedDate'].split("-")[0],
                description=data['volumeInfo']["description"],
                # img_url=f"{MOVIE_DB_IMAGE_URL}{data['poster_path']}",
                img_url=f"{data['volumeInfo']['imageLinks']['thumbnail']}",
            )
            db.session.add(new_movie)
            db.session.commit()
            return redirect(url_for("rate_movie", id=new_movie.id))
    return app

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