from sqlalchemy import Column, Integer, String, DateTime, Text, ForeignKey, Enum, Boolean, Numeric
from sqlalchemy.sql import func
from common.database import Base
from common.encryption import encryption
from datetime import datetime

class Company(Base):
    __tablename__ = "companies"
    
    id = Column(Integer, primary_key=True, index=True)
    user_id = Column(Integer, nullable=False)
    company_name = Column(String(255), nullable=False)
    company_reg_number = Column(String(250), nullable=False)
    type = Column(Integer, nullable=False)
    status = Column(String(250), nullable=False)
    created_at = Column(DateTime, default=func.now())
    updated_at = Column(DateTime, default=func.now(), onupdate=func.now())

class Bot(Base):
    __tablename__ = "bots"
    
    id = Column(Integer, primary_key=True, index=True)
    company_id = Column(Integer, nullable=False)
    bot_name = Column(String(250), nullable=False)
    gender = Column(String(1), nullable=False)
    purpose = Column(Enum('Incoming', 'Outgoing', 'Scheduling', 'Others'))
    bot_structure = Column(Text, nullable=False)
    status = Column(Enum('active', 'inactive'), default='active')
    created_at = Column(DateTime, default=func.now())
    updated_at = Column(DateTime, default=func.now(), onupdate=func.now())

class OperationalSettings(Base):
    __tablename__ = "operational_settings"
    
    id = Column(Integer, primary_key=True, index=True)
    company_id = Column(Integer, unique=True, nullable=False)
    setting = Column(Text, nullable=False)
    created_at = Column(DateTime, default=func.now())
    updated_at = Column(DateTime, default=func.now(), onupdate=func.now())

class CompanyPackagePayment(Base):
    __tablename__ = "company_package_payment"
    
    id = Column(Integer, primary_key=True, index=True)
    company_id = Column(Integer)
    package = Column(Integer)
    current_balance = Column(Numeric(10, 5))
    min_balance = Column(Integer, default=10)
    created_at = Column(DateTime, default=func.now())
    updated_at = Column(DateTime, default=func.now(), onupdate=func.now())

class Package(Base):
    __tablename__ = "packages"

    id = Column(Integer, primary_key=True, autoincrement=True)
    package_name = Column(String(250), nullable=False)
    pack_code = Column(String(15), nullable=True)
    is_default = Column(Integer, nullable=True)
    bots = Column(Integer, nullable=False)
    purpose = Column(String(250), nullable=False)
    price_monthly = Column(Integer, nullable=False)
    price_yearly = Column(Integer, nullable=False)
    created_at = Column(DateTime, server_default=func.now(), nullable=False)
    updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), nullable=False)

class PhoneNumber(Base):
    __tablename__ = "phone_numbers"
    
    id = Column(Integer, primary_key=True, index=True)
    company_id = Column(Integer, ForeignKey("companies.id"))
    phone_number = Column(String(20), nullable=False)
    vapi_phone_id = Column(String(255))
    status = Column(String(50), default="active")
    created_at = Column(DateTime, default=func.now())
    updated_at = Column(DateTime, default=func.now(), onupdate=func.now()) 

class CompanyPhone(Base):
    __tablename__ = "company_phone"
    
    id = Column(Integer, primary_key=True, index=True)
    org_id = Column(String(36), unique=True, nullable=False)
    company_id = Column(Integer, ForeignKey("companies.id"))
    bot_id = Column(Integer, ForeignKey("bots.id"))
    phone_number = Column(String(20), nullable=False)
    provider_keys = Column(String(255))
    vapi_phone_id = Column(String(255))
    serverUrl = Column(String(255), nullable=False)
    status = Column(Integer, default=1)
    created_at = Column(DateTime, nullable=False)
    updated_at = Column(DateTime, nullable=False)

    def __init__(self, **kwargs):
        # Set current timestamp for created_at and updated_at
        kwargs['created_at'] = kwargs.get('created_at', datetime.utcnow())
        kwargs['updated_at'] = kwargs.get('updated_at', datetime.utcnow())
        
        # Set serverUrl from settings if not provided
        if 'serverUrl' not in kwargs:
            from common.config import settings
            kwargs['serverUrl'] = settings.SERVER_URL
            
        # Convert status string to integer if provided
        if 'status' in kwargs and isinstance(kwargs['status'], str):
            kwargs['status'] = 1 if kwargs['status'].lower() == 'active' else 0
            
        # Combine and encrypt Twilio credentials before saving
        if 'twilio_sid' in kwargs and 'twilio_auth_token' in kwargs:
            provider_keys = f"{kwargs.pop('twilio_sid')},{kwargs.pop('twilio_auth_token')}"
            kwargs['provider_keys'] = encryption.encrypt(provider_keys)
        super().__init__(**kwargs)

    @property
    def twilio_credentials(self):
        """Returns tuple of (twilio_sid, twilio_auth_token)"""
        if self.provider_keys:
            decrypted = encryption.decrypt(self.provider_keys)
            return tuple(decrypted.split(','))
        return None, None

    @property
    def twilio_sid(self):
        return self.twilio_credentials[0]

    @property
    def twilio_auth_token(self):
        return self.twilio_credentials[1]

    @property
    def is_active(self):
        """Returns True if status is 1, False otherwise"""
        return self.status == 1 