import firebase_admin
from firebase_admin import credentials, auth, firestore
import uuid
import random
from datetime import datetime, timedelta

# Initialize Firebase Admin
if not firebase_admin._apps:
    try:
        cred = credentials.Certificate("firebase-key.json")
        firebase_admin.initialize_app(cred)
    except Exception as e:
        print(f"Error loading firebase-key.json: {e}")
        print("Please ensure GOOGLE_APPLICATION_CREDENTIALS or firebase-key.json is present.")
        exit(1)

db = firestore.client()

def create_or_update_user(email, password, role, tier):
    try:
        try:
            user = auth.get_user_by_email(email)
            auth.update_user(user.uid, password=password)
            print(f"Updated existing user auth: {email}")
        except auth.UserNotFoundError:
            user = auth.create_user(email=email, password=password)
            print(f"Created new user auth: {email}")

        # Update Firestore user doc
        db.collection('users').document(user.uid).set({
            'email': email,
            'role': role,
            'tier': tier,
            'created_at': datetime.utcnow().isoformat()
        })
        print(f"Set Firestore doc for: {email}")
        return user.uid
    except Exception as e:
        print(f"Failed to create user {email}: {e}")
        return None

def seed_data():
    print("Starting seed...")

    # 1. Create Admin
    admin_uid = create_or_update_user('developer@cwd.co.in', 'Admin@12345', 'admin', 'enterprise')

    # 2. Create Subscriber
    sub_email = 'subscriber@example.com'
    sub_uid = create_or_update_user(sub_email, 'subscriber@12345', 'subscriber', 'pro')

    if not sub_uid:
        print("Failed to get subscriber UID. Exiting.")
        return

    # 3. Create Dummy Domains for Subscriber
    domains = [
        {"name": "Acme Corp", "url": "https://acme.com", "provider": "openai"},
        {"name": "TechFlow", "url": "https://techflow.io", "provider": "gemini"}
    ]
    
    domain_ids = []
    print("\nCreating Domains...")
    for d in domains:
        ref = db.collection('domains').document()
        ref.set({
            'user_id': sub_uid,
            'name': d['name'],
            'domain_url': d['url'],
            'embedding_provider': d['provider'],
            'is_active': True,
            'widget_title': f"{d['name']} Support",
            'widget_theme_color': '#7C3AED',
            'widget_placeholder': 'Ask me anything...',
            'retrain_status': 'completed',
            'created_at': (datetime.utcnow() - timedelta(days=random.randint(1, 30))).isoformat()
        })
        domain_ids.append(ref.id)
        print(f"Created domain: {d['name']} ({ref.id})")

    # 4. Create FAQ Groups
    print("\nCreating FAQ Groups...")
    groups = [
        {"name": "General Support"},
        {"name": "Billing & Refund FAQs"}
    ]
    group_ids = []
    for g in groups:
        g_id = str(uuid.uuid4())
        db.collection('faq_groups').document(g_id).set({
            'id': g_id,
            'name': g['name'],
            'subscriber_uid': sub_uid,
            'created_at': datetime.utcnow().isoformat()
        })
        group_ids.append(g_id)
        print(f"Created group: {g['name']} ({g_id})")

    # 5. Create Domain Group Mappings
    print("\nCreating Domain-Group Mappings...")
    # Acme Corp gets both General Support and Billing
    # TechFlow gets only General Support
    mappings = [
        {"domain_id": domain_ids[0], "group_id": group_ids[0]},
        {"domain_id": domain_ids[0], "group_id": group_ids[1]},
        {"domain_id": domain_ids[1], "group_id": group_ids[0]}
    ]
    for m in mappings:
        m_id = str(uuid.uuid4())
        db.collection('domain_group_mapping').document(m_id).set({
            'id': m_id,
            'domain_id': m['domain_id'],
            'group_id': m['group_id'],
            'subscriber_uid': sub_uid,
            'created_at': datetime.utcnow().isoformat()
        })
        print(f"Mapped Domain {m['domain_id'][:8]} to Group {m['group_id'][:8]}")

    # 6. Create FAQs with dummy embeddings
    print("\nCreating FAQs...")
    faqs = [
        {
            "group_id": group_ids[0],
            "q": "What are your business hours?",
            "a": "We are open Monday to Friday, 9 AM to 5 PM EST.",
            "aliases": ["office hours", "when are you open", "closing time"]
        },
        {
            "group_id": group_ids[1],
            "q": "Do you offer refunds?",
            "a": "Yes, we offer a 30-day money-back guarantee.",
            "aliases": ["money back", "cancel policy", "refund procedure"]
        },
        {
            "group_id": group_ids[0],
            "q": "How can I contact support?",
            "a": "You can reach us at support@example.com.",
            "aliases": ["help desk", "email address", "customer service"]
        }
    ]
    
    # Dummy embedding vector (length 1536)
    dummy_embedding = [0.0] * 1536

    for f in faqs:
        faq_id = str(uuid.uuid4())
        db.collection('faqs').document(faq_id).set({
            'id': faq_id,
            'group_id': f['group_id'],
            'subscriber_uid': sub_uid,
            'question': f['q'],
            'answer': f['a'],
            'aliases': f['aliases'],
            'embedding': dummy_embedding,
            'created_at': datetime.utcnow().isoformat()
        })
        
        # Add entries to faq_aliases collection
        for alias in f['aliases']:
            alias_id = str(uuid.uuid4())
            db.collection('faq_aliases').document(alias_id).set({
                'id': alias_id,
                'faq_id': faq_id,
                'alias': alias,
                'subscriber_uid': sub_uid,
                'created_at': datetime.utcnow().isoformat()
            })
            
    print("Created FAQs with Aliases and Embeddings.")

    # 7. Create Dummy Failed Questions
    print("\nCreating Failed Questions...")
    failed_qs = [
        "How do I configure SAML SSO?",
        "What is the SLA for enterprise?",
        "Can I pay with Bitcoin?",
        "How to migrate from the old platform?"
    ]
    for i, q in enumerate(failed_qs):
        status = 'pending' if i < 2 else 'resolved'
        db.collection('failed_questions').add({
            'domain_id': domain_ids[0],
            'subscriber_uid': sub_uid,
            'query': q,
            'session_id': str(uuid.uuid4()),
            'status': status,
            'created_at': (datetime.utcnow() - timedelta(hours=random.randint(1, 48))).isoformat()
        })
    print("Created Failed Questions.")

    print("\nSeeding Complete!")
    print("========================")
    print("Admin Login: developer@cwd.co.in / Admin@12345")
    print(f"Subscriber Login: {sub_email} / subscriber@12345")
    print("========================")

if __name__ == '__main__':
    seed_data()
