from flask_restful import Resource
import globals
from src import auth
from webargs.flaskparser import use_kwargs
from webargs import fields
from marshmallow import Schema
from bson import json_util, ObjectId

class lineSchema(Schema):
    size = fields.Str()
    font = fields.Str()
    color = fields.Str()
    text = fields.Str()
    bbox = fields.List(fields.Integer())
    bboxScaled = fields.List(fields.Integer())
    pageId = fields.Str()
    fileId = fields.Str()
    current = fields.Integer()
    ocr = fields.Str()
    parent = fields.Str()
    cursor = fields.Integer()

dictionary = {
    "size": fields.Str(required=True),
    "font": fields.Str(required=True),
    "color": fields.Str(required=True),
    "text": fields.Str(required=True),
    "bbox": fields.List(fields.Integer(required=True)),
    "bboxScaled": fields.List(fields.Integer(required=True)),
    "pageId": fields.Str(required=True),
    "fileId": fields.Str(required=True),
    "current": fields.Integer(required=True),
    "ocr": fields.Str(required=True),
    "parent": fields.Str(required=True),
    "PROB": fields.Str(required=True),
    "letterSpacing": fields.Str(required=True),
    "wordSpacing": fields.Str(required=True),
    "textRotate": fields.Number(required=True),
    "lineHeight": fields.Str(required=True),
    "pageLineIndex": fields.Integer(required=True),
    "fontWeight": fields.Str(required=True),
    "cursor": fields.Integer(required=True),
    "fontStyle" : fields.Str(required=True),
    "textDecoration": fields.Str(required=True),
    "customCSS": fields.Str(required=True)

}

linesDB = globals.linesDB
auth_args = {"Authorization": fields.Str(required=True)}


class NewLine(Resource):
    parent_args = dictionary

    @use_kwargs(auth_args, location="headers")
    @use_kwargs(parent_args)
    def post(self, Authorization, size,font,color,text,bbox,customCSS,fontStyle,textDecoration,bboxScaled,pageId,fileId,lineHeight,textRotate,current,ocr,parent,PROB,letterSpacing,wordSpacing,pageLineIndex,fontWeight,cursor):
        if auth.verify(str(Authorization).split(" ")[1]):
            id = str(linesDB.insert_one({
                "size":size,"font":font,"color":color,"text":text,"bbox":bbox,
                "bboxScaled":bboxScaled,"pageId":pageId,"fileId":fileId,
                "current":current,"ocr":ocr,"parent":parent,"PROB":PROB,
                "textRotate":textRotate,"lineHeight":lineHeight,"letterSpacing":letterSpacing,"wordSpacing":wordSpacing,
                "pageLineIndex":pageLineIndex,"fontWeight":fontWeight,"cursor":cursor,
                 "fontStyle": fontStyle,"textDecoration": textDecoration,"customCSS": customCSS
            }).inserted_id)
            return {"msg": id}, 200
        else:
            return {"msg": "Unauthorized! Access Denied"}, 401


class UpdateLine(Resource):
    parent_args = dictionary
    parent_args["_id"] = fields.Str(required=True)

    @use_kwargs(auth_args, location="headers")
    @use_kwargs(parent_args)
    def put(self, Authorization,_id, size,font,color,text,bbox,fontStyle,customCSS,textDecoration,textRotate,lineHeight, bboxScaled,pageId,fileId,current,ocr,parent,PROB,letterSpacing,wordSpacing,pageLineIndex,fontWeight,cursor):
        if auth.verify(str(Authorization).split(" ")[1]):
            count = linesDB.update_one({
                "_id": ObjectId(_id)
            },
                {
                    "$set": {
                        "size": size,
                        "font": font,
                        "color": color,
                        "text": text,
                        "bbox": bbox,
                        "bboxScaled": bboxScaled,
                        "pageId": pageId,
                        "fileId": fileId,
                        "current": current,
                        "ocr": ocr,
                        "parent": parent,
                        "PROB": PROB,
                        "letterSpacing": letterSpacing,
                        "wordSpacing": wordSpacing,
                        "pageLineIndex": pageLineIndex,
                        "fontWeight": fontWeight,
                        "lineHeight": lineHeight,
                        "textRotate": textRotate,
                        "cursor": cursor,
                        "fontStyle": fontStyle,
                        "textDecoration": textDecoration,
                        "customCSS": customCSS
                    }
            }).modified_count
            return {"msg": count}, 200
        else:
            return {"msg": "Unauthorized! Access Denied"}, 401


class DeleteLine(Resource):
    fileid = {"id": fields.Str(required=True)}

    @use_kwargs(fileid, location="query")
    @use_kwargs(auth_args, location="headers")
    def delete(self,Authorization, id):
        if auth.verify(str(Authorization).split(" ")[1]):
            linesDB.delete_one({"_id":ObjectId(id)})
            return {"msg": "Deleted Successfully"}
        else:
            return {"msg": "Unauthorized! Access Denied"}, 401
