class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String, index=True)
    accepted = db.Column(db.Boolean, default=False)
    password_hash = db.Column(db.String(120))
    completed = db.Column(db.Boolean, default=False)
    first_name = db.Column(db.String(100))
    last_name = db.Column(db.String(100))
    phone_number = db.Column(db.String(30))
    service_requests = db.relationship('ServiceRequests', backref='requester', lazy=True)

    def hash_password(self, password):
        self.password_hash = pwd_context.hash(password)

    def verify_password(self, password):
        return pwd_context.verify(password, self.password_hash)

    def generate_auth_token(self, expiration=600):
        s = Serializer(cfg['SECRET_KEY'], expires_in=expiration)
        return s.dumps({'id': self.id})

    @staticmethod
    def verify_auth_token(token):
        s = Serializer(cfg['SECRET_KEY'])
        try:
            data = s.loads(token)
        except SignatureExpired:
            return None  # valid token, but expired
        except BadSignature:
            return None  # invalid token
        user = User.query.get(data['id'])
        return user
class Posting(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200))
    pricing = db.Column(db.Float)
    date_posted = db.Column(db.DateTime)
    body = db.Column(db.String(2500))
    business = db.Column(db.Integer, db.ForeignKey('business.id'), nullable=True)
    tags = db.relationship('Category', secondary=posting_categories, lazy='subquery',
                           backref=db.backref('posting', lazy=True))
class ServiceRequests(db.Model):
    request_id = db.Column(db.Integer, primary_key=True)
    user = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    details = db.Column(db.String(1000))
class Category(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100))
    description = db.Column(db.String(500))
class Business(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(200))
    contact_email = db.Column(db.String(250))
    contact_number = db.Column(db.String(30))
    postings = db.relationship('Posting', backref='poster', lazy=True)
"""
Holds marshmallow schemas and database models for the application.
"""
from flask_sqlalchemy import SQLAlchemy

from helpr import db, ma, cfg
from passlib.apps import custom_app_context as pwd_context
from itsdangerous import (TimedJSONWebSignatureSerializer
                          as Serializer,
                          BadSignature,
                          SignatureExpired)

posting_categories = db.Table('posting_categories',
                              db.Column('posting_id', db.Integer, db.ForeignKey('posting.id'), primary_key=True),
                              db.Column('category_id', db.Integer, db.ForeignKey('category.id'), primary_key=True)
                              )
db: SQLAlchemy


class Posting(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200))
    pricing = db.Column(db.Float)
    date_posted = db.Column(db.DateTime)
    body = db.Column(db.String(2500))
    business = db.Column(db.Integer, db.ForeignKey('business.id'), nullable=True)
    tags = db.relationship('Category', secondary=posting_categories, lazy='subquery',
                           backref=db.backref('posting', lazy=True))


class Business(db.Model):