from models.modules.core import logger, request, InvalidUsage, make_response, app, url_for
from models.libs.jwt import decodejwt, get_userinfo
from models.dbmodels.skits_model import *
from datetime import datetime
import ast

class SkitsReviews():
        
    def add_reviews():
        try:
            userInfo = dict(decodejwt())
            action = request.json['action']
            skit_id = request.json['skit_id']
            data = request.json['data']

            reviewInfo = ReviewModel.query.filter_by(skit_id = skit_id).first()
            if reviewInfo is None:
                return make_response({
                    "error": "invalid skit id"
                }, 400)

            review = review_scheme.dump(reviewInfo)
            review[action] = ast.literal_eval(review[action])
            review[action] = SkitsReviews.process_like(review[action], data) if action == 'likes' else SkitsReviews.process_comment(review[action], data)
            
            if action == 'likes':
                reviewInfo.likes = str(review[action])
            if action == 'comments':
                reviewInfo.comments = str(review[action])
                
            db.session.commit()
            db.session.close()
            return make_response({
                "message": f"{action} saved",
            }, 200)

        except exc.SQLAlchemyError as e:
            raise Exception(e._message)
        except Exception as e:
            raise Exception(str(e))
    
    def process_like(likes: {}, data):
        try:
            isFound = False
            for like in likes:
                if like['posted_by'] == request.json['posted_by']:
                    like['like'] = bool(data['like'])
                    isFound = True
            if isFound is False:
                likes.append({
                    'posted_by': request.json['posted_by'],
                    'like': bool(data['like']),
                })
            return likes
        except Exception as e:
            raise Exception(str(e))
    
    def process_comment(comments: {}, data):
        try:
            isFound = False
            for comment in comments:
                if comment['posted_by'] == request.json['posted_by']:
                    comment['review'] = data['comments']['review']
                    isFound = True
            if isFound is False:
                data['comments']['posted_on'] = str(datetime.now().utcnow())
                comments.append(data['comments'])
            return comments
        except Exception as e:
            raise Exception(str(e))

    def update_reviews(id):
        try:
            comments = request.json['comments']
            likes = request.json['likes']
            
            reviewinfo = ReviewModel.query.filter_by(skit_id = id).first()
            if not reviewinfo:
                return make_response({
                    "error": "invalid skit id to review"
                }, 400)

            reviewinfo.comments = str(comments)
            reviewinfo.likes = str(likes)

            db.session.add(reviewinfo)
            db.session.commit()
            db.session.close()
            return make_response({
                "message": "review info updated",
            }, 200)

        except exc.SQLAlchemyError as e:
            raise Exception(e._message)
        except Exception as e:
            raise Exception(str(e))
    
   