from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
from app.db import db

class City(db.Model):
    __tablename__ = 'cities'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True, nullable=False)

    def __repr__(self):
        return f"<City {self.name}>"

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(100), nullable=False)
    last_name = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    phone = db.Column(db.String(20))
    city_id = db.Column(db.Integer, db.ForeignKey('cities.id'))
    birthday = db.Column(db.Date)
    password_hash = db.Column(db.String(255), nullable=False)
    user_type = db.Column(db.Enum('doctor', 'patient', name='user_type_enum'), nullable=False)
    user_token = db.Column(db.String(255))
    is_verified = db.Column(db.Boolean, default=False)
    verification_code = db.Column(db.String(6))
    reset_code = db.Column(db.String(6))  
    reset_code_expiration = db.Column(db.DateTime)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    status = db.Column(db.Integer, default=1)
    deleted_at = db.Column(db.DateTime)

    city = db.relationship('City', backref='users')

    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)

    def soft_delete(self):
        self.deleted_at = datetime.utcnow()

class Plak(db.Model):
    __tablename__ = 'plaks'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    description = db.Column(db.Text, nullable=False)
    image_url = db.Column(db.String(255))  # Optional
    created_by = db.Column(db.Integer, db.ForeignKey('users.id'))  # Doctor
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

    doctor = db.relationship('User', backref='plaks')


class SelectedPlak(db.Model):
    __tablename__ = 'selected_plaks'
    id = db.Column(db.Integer, primary_key=True)
    plak_id = db.Column(db.Integer, db.ForeignKey('plaks.id'), nullable=False)
    patient_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    selected_at = db.Column(db.DateTime, default=datetime.utcnow)

    plak = db.relationship('Plak', backref='selections')
    patient = db.relationship('User', backref='selected_plaks')

class TreatmentPhoto(db.Model):
    __tablename__ = 'treatment_photos'

    id = db.Column(db.Integer, primary_key=True)
    doctor_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    patient_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    plak_id = db.Column(db.Integer, db.ForeignKey('plaks.id'), nullable=False)
    title = db.Column(db.String(255), nullable=False)
    note = db.Column(db.Text)
    photo_path = db.Column(db.String(255), nullable=False)
    photo_date = db.Column(db.Date, nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    deleted_at = db.Column(db.DateTime, nullable=True)

    doctor = db.relationship('User', foreign_keys=[doctor_id])
    patient = db.relationship('User', foreign_keys=[patient_id])
    plak = db.relationship('Plak', backref='treatment_photos')


class Notification(db.Model):
    __tablename__ = 'notifications'
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    title = db.Column(db.String(255))
    message = db.Column(db.Text)
    is_read = db.Column(db.Boolean, default=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

    user = db.relationship('User', backref='notifications')
