import uuid
from datetime import datetime
from typing import Optional
from sqlalchemy import String, Boolean, Integer, DateTime, Text
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.database import Base, GUID


class Tenant(Base):
    __tablename__ = "tenants"

    id: Mapped[uuid.UUID] = mapped_column(GUID, primary_key=True, default=uuid.uuid4)
    name: Mapped[str] = mapped_column(String(255), nullable=False)
    name_ar: Mapped[str] = mapped_column(String(255), nullable=True)
    email: Mapped[str] = mapped_column(String(255), unique=True, nullable=False)
    phone: Mapped[str] = mapped_column(String(50), nullable=True)
    
    # LifeSmart API Credentials
    lifesmart_app_key: Mapped[str] = mapped_column(String(255), nullable=True)
    lifesmart_app_token: Mapped[str] = mapped_column(Text, nullable=True)
    lifesmart_user_id: Mapped[str] = mapped_column(String(255), nullable=True)
    lifesmart_user_token: Mapped[str] = mapped_column(Text, nullable=True)
    lifesmart_region: Mapped[str] = mapped_column(String(50), default="global")
    
    # Subscription
    subscription_plan: Mapped[str] = mapped_column(String(50), default="basic")
    max_devices: Mapped[int] = mapped_column(Integer, default=50)
    max_sensors: Mapped[int] = mapped_column(Integer, default=100)
    max_users: Mapped[int] = mapped_column(Integer, default=5)
    subscription_start: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
    subscription_end: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
    is_subscription_active: Mapped[bool] = mapped_column(Boolean, default=True)
    auto_renew: Mapped[bool] = mapped_column(Boolean, default=False)
    
    is_active: Mapped[bool] = mapped_column(Boolean, default=True)
    created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
    updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

    # Relationships
    users = relationship("User", back_populates="tenant", cascade="all, delete-orphan")
    devices = relationship("Device", back_populates="tenant", cascade="all, delete-orphan")
    alert_rules = relationship("AlertRule", back_populates="tenant", cascade="all, delete-orphan")
    alert_logs = relationship("AlertLog", back_populates="tenant", cascade="all, delete-orphan")
