
from appl import db

class SpaVerb(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    infinitive = db.Column(db.String(32), index=True, unique=True)
    stem = db.Column(db.String(32))
    ending = db.Column(db.String(2))

    translations = db.relationship('Translation', backref='spa_verb', 
                     lazy='dynamic')

    exceptions = db.relationship('Exception', backref='spa_verb',
                     lazy='dynamic')

    def __repr__(self):
        return f'<{self.__class__.__name__} {self.infinitive}>'

class EngVerb(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    infinitive = db.Column(db.String(32), index=True, unique=True)

    translations = db.relationship('Translation', backref='eng_verb', 
                     lazy='dynamic')

    def __repr__(self):
        return f'<{self.__class__.__name__} {self.infinitive}>'

class Translation(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    spa_verb_id = db.Column(db.Integer, db.ForeignKey('spa_verb.id'))
    eng_verb_id = db.Column(db.Integer, db.ForeignKey('eng_verb.id'))

    def __repr__(self):
        return f'<Translation: spa={self.spa_verb_id} eng={self.eng_verb_id}>'

class Tense(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), index=True, unique=True)

    def __repr__(self):
        return f'<Tense: {self.name}>'

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), index=True, unique=True)
    plural = db.Column(db.Boolean)

    pronouns = db.relationship('Pronoun', backref='person', lazy='dynamic')

    def __repr__(self):
        return f'<Person: {self.name}>'

class Pronoun(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    pronoun = db.Column(db.String(16), index=True, unique=True)
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))

    def __repr__(self):
        return f'<Pronoun: {self.pronoun}>'

class Ending(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    ending = db.Column(db.String(2))
    newending = db.Column(db.String(8))
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
    tense_id = db.Column(db.Integer, db.ForeignKey('tense.id'))

    def __repr__(self):
        return f'<Ending: {self.ending} {self.newending}>'

class Exception(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    conjugation = db.Column(db.String(32))
    verb_id = db.Column(db.Integer, db.ForeignKey('spa_verb.id'))
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
    tense_id = db.Column(db.Integer, db.ForeignKey('tense.id'))

    def __repr__(self):
        return f'<Exception: {self.conjugation}>'

# session support

class Session(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    session_id = db.Column(db.String(64), index=True, unique=True)
    data = db.Column(db.LargeBinary)
    created = db.Column(db.DateTime)
    expires = db.Column(db.DateTime)
    ipaddr = db.Column(db.String(64))

    def __repr__(self):
        return f'<Session: {self.session_id}>'
