"""Base de données et comptes utilisateurs.

Les noms de tables et de colonnes reprennent ceux d'OnDive (table « user ») pour
permettre d'y migrer les comptes propriétaires de dossiers.
"""
from datetime import datetime

from flask_login import UserMixin
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import validates
from werkzeug.security import generate_password_hash, check_password_hash

db = SQLAlchemy()


class User(UserMixin, db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(120), unique=True, nullable=False, index=True)
    password_hash = db.Column(db.String(255), nullable=False)
    first_name = db.Column(db.String(50))
    last_name = db.Column(db.String(50))
    certification_agency = db.Column(db.String(30), default='PADI')
    certification_number = db.Column(db.String(50))  # n° PADI : reconnaît l'instructeur connecté qui signe
    is_active = db.Column(db.Boolean, nullable=False, default=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

    @validates('email')
    def _lower_email(self, key, value):
        return (value or '').strip().lower()

    def set_password(self, password):
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

    @property
    def display_name(self):
        full = f'{self.first_name or ""} {self.last_name or ""}'.strip()
        return full or self.email
