"""
User Domain Models

SQLAlchemy ORM models for users and related tables:
- User: Main user entity
- UserProfile: Extended user profile information
- UserSports: Sports-related user data
- UserHealth: Health and fitness information
- UserConsent: User consent and permissions
- UserGuardians: Guardian/parent information
- UserMarketing: Marketing and feedback data
- UserFinance: Financial information
"""

from sqlalchemy import Column, Integer, String, Text, Float, ForeignKey
from sqlalchemy.orm import relationship
from datetime import datetime
from .base import Base


class User(Base):
    """Main user model"""
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True, autoincrement=True)
    email = Column(String, nullable=False, unique=True)
    name = Column(String, nullable=False)
    first_name = Column(String)
    last_name = Column(String)
    phone = Column(String)
    password_hash = Column(String, nullable=False)
    role = Column(String, nullable=False, default='alumno')
    is_mvp90 = Column(Integer, nullable=False, default=0)
    is_temporary = Column(Integer, nullable=False, default=0)
    created_at = Column(String, nullable=False, default=lambda: datetime.now().strftime('%Y-%m-%dT%H:%M:%S'))
    
    # Relationships
    profile = relationship("UserProfile", back_populates="user", uselist=False, cascade="all, delete-orphan")
    sports = relationship("UserSports", back_populates="user", uselist=False, cascade="all, delete-orphan")
    health = relationship("UserHealth", back_populates="user", uselist=False, cascade="all, delete-orphan")
    consent = relationship("UserConsent", back_populates="user", uselist=False, cascade="all, delete-orphan")
    guardians = relationship("UserGuardians", back_populates="user", uselist=False, cascade="all, delete-orphan")
    marketing = relationship("UserMarketing", back_populates="user", uselist=False, cascade="all, delete-orphan")
    finance = relationship("UserFinance", back_populates="user", uselist=False, cascade="all, delete-orphan")
    
    def __repr__(self):
        return f"<User(id={self.id}, email='{self.email}', role='{self.role}')>"


class UserProfile(Base):
    """User profile extended information"""
    __tablename__ = 'user_profile'
    
    user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), primary_key=True)
    phone = Column(String)
    avatar = Column(String)
    city = Column(String)
    dni = Column(String)
    dni = Column(String)
    birth_date = Column(String)
    gender = Column(String)
    
    # Relationships
    user = relationship("User", back_populates="profile")
    
    def __repr__(self):
        return f"<UserProfile(user_id={self.user_id})>"


class UserSports(Base):
    """User sports-related data"""
    __tablename__ = 'user_sports'
    
    user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), primary_key=True)
    team = Column(String)
    category = Column(String)
    position = Column(String)
    dominant_foot = Column(String)
    strengths = Column(String)
    weaknesses = Column(String)
    injury_history = Column(String)
    training_type = Column(String)
    
    # Relationships
    user = relationship("User", back_populates="sports")
    
    def __repr__(self):
        return f"<UserSports(user_id={self.user_id}, position='{self.position}')>"


class UserHealth(Base):
    """User health and fitness information"""
    __tablename__ = 'user_health'
    
    user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), primary_key=True)
    physical_work = Column(Integer)
    physical_work_details = Column(Text)
    smoking = Column(Integer)
    alcohol = Column(Integer)
    recovery = Column(Text)
    chest_pain = Column(Integer)
    discomfort = Column(Integer)
    
    # Relationships
    user = relationship("User", back_populates="health")
    
    def __repr__(self):
        return f"<UserHealth(user_id={self.user_id})>"


class UserConsent(Base):
    """User consent and permissions"""
    __tablename__ = 'user_consent'
    
    user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), primary_key=True)
    whatsapp_content = Column(Integer)
    video_permission = Column(Integer)
    privacy_acceptance = Column(Integer)
    data_confirmation = Column(Integer)
    agreement = Column(Integer)
    
    # Relationships
    user = relationship("User", back_populates="consent")
    
    def __repr__(self):
        return f"<UserConsent(user_id={self.user_id})>"


class UserGuardians(Base):
    """User guardian/parent information"""
    __tablename__ = 'user_guardians'
    
    user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), primary_key=True)
    occupation = Column(Text)
    study_place = Column(Text)
    parent_name = Column(Text)
    parent_email = Column(Text)
    
    # Relationships
    user = relationship("User", back_populates="guardians")
    
    def __repr__(self):
        return f"<UserGuardians(user_id={self.user_id})>"


class UserMarketing(Base):
    """User marketing and feedback data"""
    __tablename__ = 'user_marketing'
    
    user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), primary_key=True)
    found_us = Column(Text)
    enjoyment = Column(Text)
    nerves_confidence = Column(Text)
    additional_comments = Column(Text)
    
    # Relationships
    user = relationship("User", back_populates="marketing")
    
    def __repr__(self):
        return f"<UserMarketing(user_id={self.user_id})>"


class UserFinance(Base):
    """User financial information"""
    __tablename__ = 'user_finance'
    
    user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), primary_key=True)
    matricula_eur = Column(Float, nullable=False, default=0.0)
    
    # Relationships
    user = relationship("User", back_populates="finance")
    
    def __repr__(self):
        return f"<UserFinance(user_id={self.user_id}, matricula_eur={self.matricula_eur})>"
