"""
Client Settings Models
White-label settings, branding, and configurations
"""
from datetime import datetime
from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime, ForeignKey, JSON
from sqlalchemy.orm import relationship

from app.models.base import Base, TimestampMixin


class ClientWhiteLabelSettings(Base, TimestampMixin):
    """
    White-label settings for client branding
    """
    __tablename__ = "client_whitelabel_settings"

    id = Column(Integer, primary_key=True, index=True)
    client_id = Column(Integer, ForeignKey("clients.id"), unique=True, nullable=False, index=True)

    # Branding - Logo
    logo_url = Column(String(500), nullable=True)
    logo_dark_url = Column(String(500), nullable=True)  # For dark mode
    favicon_url = Column(String(500), nullable=True)

    # Branding - Colors
    primary_color = Column(String(20), default="#3B82F6")  # Blue
    secondary_color = Column(String(20), default="#10B981")  # Green
    accent_color = Column(String(20), default="#F59E0B")  # Amber
    background_color = Column(String(20), default="#FFFFFF")
    text_color = Column(String(20), default="#1F2937")

    # Chat Widget Styling
    widget_position = Column(String(20), default="bottom-right")  # bottom-right, bottom-left
    widget_button_color = Column(String(20), nullable=True)
    widget_header_color = Column(String(20), nullable=True)
    widget_border_radius = Column(Integer, default=12)  # px
    widget_shadow = Column(Boolean, default=True)

    # Chat Widget Text
    widget_title = Column(String(100), default="Chat with us")
    widget_subtitle = Column(String(200), nullable=True)
    widget_welcome_message = Column(Text, nullable=True)
    widget_placeholder_text = Column(String(200), default="Type a message...")
    widget_offline_message = Column(Text, nullable=True)

    # Custom Domain
    custom_domain = Column(String(255), nullable=True)
    custom_domain_verified = Column(Boolean, default=False)
    custom_domain_verified_at = Column(DateTime, nullable=True)

    # Email Branding
    email_from_name = Column(String(100), nullable=True)
    email_reply_to = Column(String(255), nullable=True)
    email_footer_text = Column(Text, nullable=True)
    email_logo_url = Column(String(500), nullable=True)

    # Social Links
    social_links = Column(JSON, nullable=True)  # {"facebook": "url", "twitter": "url", ...}

    # Legal
    privacy_policy_url = Column(String(500), nullable=True)
    terms_of_service_url = Column(String(500), nullable=True)

    # Advanced
    custom_css = Column(Text, nullable=True)  # Custom CSS for advanced styling
    custom_js = Column(Text, nullable=True)  # Custom JS (validated/sandboxed)

    # Feature Toggles
    show_powered_by = Column(Boolean, default=True)  # Show "Powered by AI360"
    enable_file_upload = Column(Boolean, default=True)
    enable_voice_input = Column(Boolean, default=False)
    enable_emoji = Column(Boolean, default=True)

    def __repr__(self):
        return f"<ClientWhiteLabelSettings client_id={self.client_id}>"


class ClientChatbotSettings(Base, TimestampMixin):
    """
    Chatbot configuration settings per client
    """
    __tablename__ = "client_chatbot_settings"

    id = Column(Integer, primary_key=True, index=True)
    client_id = Column(Integer, ForeignKey("clients.id"), unique=True, nullable=False, index=True)

    # AI Model Settings
    ai_model = Column(String(50), default="gpt-4o-mini")
    temperature = Column(Integer, default=70)  # 0-100, divided by 100
    max_tokens = Column(Integer, default=1000)
    context_window = Column(Integer, default=10)  # Messages to include as context

    # Personality
    bot_name = Column(String(100), default="AI Assistant")
    bot_avatar_url = Column(String(500), nullable=True)
    system_prompt = Column(Text, nullable=True)  # Custom system prompt
    tone = Column(String(50), default="professional")  # professional, friendly, casual

    # Behavior
    fallback_message = Column(Text, nullable=True)  # When AI can't answer
    handoff_enabled = Column(Boolean, default=False)  # Handoff to human
    handoff_trigger_keywords = Column(Text, nullable=True)  # JSON array
    handoff_message = Column(Text, nullable=True)

    # Business Hours
    business_hours_enabled = Column(Boolean, default=False)
    business_hours = Column(JSON, nullable=True)  # {"monday": {"start": "09:00", "end": "17:00"}, ...}
    timezone = Column(String(50), default="Asia/Kolkata")
    outside_hours_message = Column(Text, nullable=True)

    # Auto-responses
    greeting_message = Column(Text, nullable=True)
    goodbye_message = Column(Text, nullable=True)
    typing_indicator_delay = Column(Integer, default=1000)  # ms

    # Lead Capture
    collect_email = Column(Boolean, default=False)
    collect_phone = Column(Boolean, default=False)
    collect_name = Column(Boolean, default=False)
    lead_form_position = Column(String(20), default="start")  # start, end, never

    # Language
    default_language = Column(String(10), default="en")
    supported_languages = Column(JSON, nullable=True)  # ["en", "hi", "es"]
    auto_detect_language = Column(Boolean, default=True)

    # Knowledge Base
    use_knowledge_base = Column(Boolean, default=True)
    kb_confidence_threshold = Column(Integer, default=70)  # 0-100
    kb_fallback_to_ai = Column(Boolean, default=True)

    # Rate Limits (per user)
    messages_per_minute = Column(Integer, default=10)
    messages_per_day = Column(Integer, default=100)

    def __repr__(self):
        return f"<ClientChatbotSettings client_id={self.client_id}>"


class TeamInvitation(Base, TimestampMixin):
    """
    Team member invitations
    """
    __tablename__ = "team_invitations"

    id = Column(Integer, primary_key=True, index=True)
    client_id = Column(Integer, ForeignKey("clients.id"), nullable=False, index=True)

    # Invitation Details
    email = Column(String(255), nullable=False, index=True)
    role = Column(String(50), default="client_user")
    token = Column(String(100), unique=True, nullable=False, index=True)

    # Invited by
    invited_by_id = Column(Integer, ForeignKey("users.id"), nullable=False)

    # Status
    status = Column(String(20), default="pending")  # pending, accepted, expired, cancelled
    expires_at = Column(DateTime, nullable=False)
    accepted_at = Column(DateTime, nullable=True)

    # The user created when invitation is accepted
    accepted_user_id = Column(Integer, ForeignKey("users.id"), nullable=True)

    def __repr__(self):
        return f"<TeamInvitation {self.id}: {self.email}>"
