"""Hash implementation and save in database 
"""
import hashlib

from citext import CIText
from sqlalchemy import Column
from sqlalchemy.dialects.postgresql import UUID
from uuid import uuid4

from ereuse_devicehub.db import db


class ReportHash(db.Model):
    """Save the hash than is create when one report is download.
    """
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4)
    id.comment = """The identifier of the device for this database. Used only
    internally for software; users should not use this.
    """
    created = db.Column(db.TIMESTAMP(timezone=True),
                        nullable=False,
                        index=True,
                        server_default=db.text('CURRENT_TIMESTAMP'))
    created.comment = """When Devicehub created this."""
    hash3 = db.Column(CIText(), nullable=False)
    hash3.comment = """The normalized name of the hash."""


def insert_hash(bfile, commit=True):
    hash3 = hashlib.sha3_256(bfile).hexdigest()
    db_hash = ReportHash(hash3=hash3)
    db.session.add(db_hash)
    if commit:
        db.session.commit()
        db.session.flush()

    return hash3


def verify_hash(bfile):
    hash3 = hashlib.sha3_256(bfile.read()).hexdigest()
    return ReportHash.query.filter(ReportHash.hash3 == hash3).count()