import os
import time
from datetime import datetime

from flask import Response
from flask import current_app as app
from flask import g, request
from marshmallow import ValidationError

from ereuse_devicehub.db import db
from ereuse_devicehub.resources.action.models import ConfirmDocument
from ereuse_devicehub.resources.hash_reports import ReportHash
from ereuse_devicehub.resources.tradedocument.models import TradeDocument
from ereuse_devicehub.teal.resource import View


class TradeDocumentView(View):
    def one(self, id: str):
        doc = TradeDocument.query.filter_by(id=id, owner=g.user).one()
        return self.schema.jsonify(doc)

    def post(self):
        """Add one document."""

        try:
            data = request.get_json(validate=True)
        except ValueError as err:
            raise ValidationError(err)

        hash3 = data['file_hash']
        db_hash = ReportHash(hash3=hash3)
        db.session.add(db_hash)

        doc = TradeDocument(**data)
        trade = doc.lot.trade
        if trade:
            trade.documents.add(doc)
            confirm = ConfirmDocument(
                action=trade, user=g.user, devices=set(), documents={doc}
            )
            db.session.add(confirm)
        db.session.add(doc)
        db.session().final_flush()
        ret = self.schema.jsonify(doc)
        ret.status_code = 201
        db.session.commit()
        return ret

    def delete(self, id):
        doc = TradeDocument.query.filter_by(id=id, owner=g.user).one()
        db.session.delete(doc)
        db.session.commit()
        return Response(status=204)