try:
    from .database import db
except ImportError:
    from database import db
from datetime import datetime

class Admin(db.Model):
    __tablename__ = 'admin'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(255), nullable=False)
    avatar_url = db.Column(db.String(255))
    nickname = db.Column(db.String(100))
    timezone = db.Column(db.String(50), default='UTC')
    language = db.Column(db.String(10), default='en')
    totp_secret = db.Column(db.String(32))
    totp_enabled = db.Column(db.Boolean, default=False)
    email = db.Column(db.String(120))
    notify_on_login = db.Column(db.Boolean, default=False)
    notify_on_failed_login = db.Column(db.Boolean, default=False)
    notify_update_available = db.Column(db.Boolean, default=True)
    notify_update_installed = db.Column(db.Boolean, default=True)

class Settings(db.Model):
    __tablename__ = 'settings'
    id = db.Column(db.Integer, primary_key=True)
    smtp_server = db.Column(db.String(120))
    smtp_port = db.Column(db.Integer)
    smtp_user = db.Column(db.String(120))
    smtp_pass = db.Column(db.String(120))
    alert_email = db.Column(db.String(120))
    webhook_url = db.Column(db.String(255))
    webhook_headers = db.Column(db.Text) # JSON string
    
    # Customization
    app_name = db.Column(db.String(100), default="Limristem Web")
    logo_url = db.Column(db.String(255)) # URL or Path
    favicon_url = db.Column(db.String(255)) # URL or Path
    custom_message = db.Column(db.Text) # Login screen message
    
    # Thresholds
    cpu_limit = db.Column(db.Integer, default=90)
    ram_limit = db.Column(db.Integer, default=90)
    disk_limit = db.Column(db.Integer, default=90)
    
    # Panel Limits
    panel_upload_limit_mb = db.Column(db.Integer, default=100)
    panel_timeout_seconds = db.Column(db.Integer, default=300)

    # Update Settings
    auto_update = db.Column(db.Boolean, default=False)
    last_update_check = db.Column(db.DateTime)
    current_version = db.Column(db.String(20))

    # Server Settings (New)
    server_hostname = db.Column(db.String(200))
    panel_ssl_type = db.Column(db.String(50)) # manual, self, letsencrypt

class SystemUser(db.Model):
    __tablename__ = 'system_user'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    home_dir = db.Column(db.String(200))
    # Disk Quota
    quota_limit_mb = db.Column(db.Integer, default=0) # 0 = Unlimited
    current_disk_usage = db.Column(db.BigInteger, default=0) # Bytes
    
    # Resource Limits & Alerts
    email = db.Column(db.String(120))
    cpu_limit_percent = db.Column(db.Integer, default=0) # 0 = Default/Unlimited
    ram_limit_mb = db.Column(db.Integer, default=0)
    io_limit_mb_s = db.Column(db.Integer, default=0)
    
    # Suspension State
    is_suspended = db.Column(db.Boolean, default=False)
    suspension_reason = db.Column(db.String(50))
    suspension_end_time = db.Column(db.DateTime)
    violation_count = db.Column(db.Integer, default=0)
    last_violation_time = db.Column(db.DateTime)

class Alert(db.Model):
    __tablename__ = 'alert'
    id = db.Column(db.Integer, primary_key=True)
    type = db.Column(db.String(50)) # e.g. "Quota", "System", "Security"
    subject = db.Column(db.String(200))
    message = db.Column(db.Text)
    timestamp = db.Column(db.DateTime, default=datetime.now)
    is_read = db.Column(db.Boolean, default=False)

class Host(db.Model):
    __tablename__ = 'host'
    id = db.Column(db.Integer, primary_key=True)
    domain = db.Column(db.String(120), unique=True, nullable=False)
    php_version = db.Column(db.String(20), nullable=False)
    root_dir = db.Column(db.String(200), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('system_user.id'))
    
    # Host Type & Template
    host_type = db.Column(db.String(20), default='php') # php, html
    template = db.Column(db.String(50), default='default') # default, wordpress, symfony, laravel
    
    # Disk Quota
    quota_limit_mb = db.Column(db.Integer, default=0) # 0 = Unlimited
    current_disk_usage = db.Column(db.BigInteger, default=0) # Bytes

    # Bandwidth Limits
    traffic_limit_mb = db.Column(db.Integer, default=0) # 0 = Unlimited
    speed_limit_kbps = db.Column(db.Integer, default=0) # 0 = Unlimited
    current_traffic_bytes = db.Column(db.BigInteger, default=0)
    
    # Log State tracking
    last_log_offset = db.Column(db.BigInteger, default=0)
    last_log_inode = db.Column(db.BigInteger, default=0)
    
    # Suspension State
    is_suspended = db.Column(db.Boolean, default=False)
    suspension_reason = db.Column(db.String(50))
    
    # PHP Settings
    php_pm = db.Column(db.String(20), default='ondemand')
    php_max_children = db.Column(db.Integer, default=5)
    php_start_servers = db.Column(db.Integer, default=2)
    php_min_spare_servers = db.Column(db.Integer, default=1)
    php_max_spare_servers = db.Column(db.Integer, default=3)
    php_memory_limit = db.Column(db.String(20), default='128M')
    php_upload_max_filesize = db.Column(db.String(20), default='10M')
    php_post_max_size = db.Column(db.String(20), default='10M')
    php_max_execution_time = db.Column(db.Integer, default=30)

    # Connection Limits
    max_concurrent_connections = db.Column(db.Integer, default=10) # per IP

    # Nginx Timeout & Payload Settings (0 = use defaults: 10s/10s/15s/10MB)
    nginx_max_body_size_mb = db.Column(db.Integer, default=0)
    nginx_client_body_timeout = db.Column(db.Integer, default=0)
    nginx_client_header_timeout = db.Column(db.Integer, default=0)
    nginx_keepalive_timeout = db.Column(db.Integer, default=0)

    # SSL
    ssl_enabled = db.Column(db.Boolean, default=False)
    ssl_provider = db.Column(db.String(50)) # manual, self, letsencrypt
    ssl_expiry = db.Column(db.DateTime)

    # Default Catch-All
    is_default = db.Column(db.Boolean, default=False)

class LoginAttempt(db.Model):
    __tablename__ = 'login_attempt'
    id = db.Column(db.Integer, primary_key=True)
    ip_address = db.Column(db.String(50), nullable=False)
    timestamp = db.Column(db.DateTime, default=datetime.now)
    username = db.Column(db.String(80))
    success = db.Column(db.Boolean, default=False)

class BannedIP(db.Model):
    __tablename__ = 'banned_ip'
    id = db.Column(db.Integer, primary_key=True)
    ip_address = db.Column(db.String(50), unique=True, nullable=False)
    banned_until = db.Column(db.DateTime, nullable=False)

class BackupJob(db.Model):
    __tablename__ = 'backup_job'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    source_path = db.Column(db.String(200))
    dest_type = db.Column(db.String(20)) # 'sftp' or 's3'
    dest_config = db.Column(db.Text) # JSON config
    frequency = db.Column(db.String(20)) # 'daily', 'weekly'
    last_run = db.Column(db.DateTime)
    
    # Retention
    retention_days = db.Column(db.Integer, default=30)
    retention_count = db.Column(db.Integer, default=10)

    # MySQL Backup
    mysql_enabled = db.Column(db.Boolean, default=False)
    mysql_db_mode = db.Column(db.String(10), default='all')  # 'all', 'single', 'list'
    mysql_db_name = db.Column(db.String(100))                # for mode 'single'
    mysql_db_list = db.Column(db.Text)                       # comma-separated, for mode 'list'

class CertificateAuthority(db.Model):
    __tablename__ = 'certificate_authority'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False)
    cert_path = db.Column(db.String(255), nullable=False)
    key_path = db.Column(db.String(255), nullable=False)
    is_panel_root = db.Column(db.Boolean, default=False)
    created_at = db.Column(db.DateTime, default=datetime.now)
