import sys
import os
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent))
from sqlalchemy.orm import Session
from src.config.database import SessionLocal
from src.models.role import Role
from src.models.user import User
import bcrypt
from datetime import datetime

def get_db():
    db = SessionLocal()
    try:
        return db
    finally:
        pass

def seed_users(db: Session):
    print('=' * 80)
    print('SEEDING USERS')
    print('=' * 80)
    
    # Get roles
    admin_role = db.query(Role).filter(Role.name == 'admin').first()
    staff_role = db.query(Role).filter(Role.name == 'staff').first()
    customer_role = db.query(Role).filter(Role.name == 'customer').first()
    
    if not admin_role or not staff_role or not customer_role:
        print('  ❌ Roles not found! Please seed roles first.')
        return
    
    users_data = [
        {
            'email': 'gnxsoft@gnxsoft.com',
            'password': 'gnxsoft123',
            'full_name': 'GNXSoft Admin',
            'phone': '+1 (555) 111-2222',
            'role': 'admin',
            'currency': 'EUR',
            'is_active': True
        },
        {
            'email': 'admin@gnxsoft.com',
            'password': 'admin123',
            'full_name': 'Administrator',
            'phone': '+1 (555) 222-3333',
            'role': 'admin',
            'currency': 'EUR',
            'is_active': True
        },
        {
            'email': 'staff@gnxsoft.com',
            'password': 'staff123',
            'full_name': 'Staff Member',
            'phone': '+1 (555) 333-4444',
            'role': 'staff',
            'currency': 'EUR',
            'is_active': True
        },
        {
            'email': 'customer@gnxsoft.com',
            'password': 'customer123',
            'full_name': 'Customer User',
            'phone': '+1 (555) 444-5555',
            'role': 'customer',
            'currency': 'EUR',
            'is_active': True
        },
        {
            'email': 'john.doe@gnxsoft.com',
            'password': 'customer123',
            'full_name': 'John Doe',
            'phone': '+1 (555) 555-6666',
            'role': 'customer',
            'currency': 'USD',
            'is_active': True
        },
        {
            'email': 'jane.smith@gnxsoft.com',
            'password': 'customer123',
            'full_name': 'Jane Smith',
            'phone': '+1 (555) 666-7777',
            'role': 'customer',
            'currency': 'EUR',
            'is_active': True
        },
        {
            'email': 'robert.wilson@gnxsoft.com',
            'password': 'customer123',
            'full_name': 'Robert Wilson',
            'phone': '+1 (555) 777-8888',
            'role': 'customer',
            'currency': 'GBP',
            'is_active': True
        },
        {
            'email': 'maria.garcia@gnxsoft.com',
            'password': 'customer123',
            'full_name': 'Maria Garcia',
            'phone': '+1 (555) 888-9999',
            'role': 'customer',
            'currency': 'EUR',
            'is_active': True
        }
    ]
    
    role_map = {
        'admin': admin_role.id,
        'staff': staff_role.id,
        'customer': customer_role.id
    }
    
    created_count = 0
    skipped_count = 0
    
    for user_data in users_data:
        existing = db.query(User).filter(User.email == user_data['email']).first()
        if existing:
            print(f'  ⚠️  User "{user_data["email"]}" already exists, skipping...')
            skipped_count += 1
            continue
        
        password = user_data.pop('password')
        role_name = user_data.pop('role')
        role_id = role_map[role_name]
        
        password_bytes = password.encode('utf-8')
        salt = bcrypt.gensalt()
        hashed_password = bcrypt.hashpw(password_bytes, salt).decode('utf-8')
        
        user = User(
            email=user_data['email'],
            password=hashed_password,
            full_name=user_data['full_name'],
            phone=user_data.get('phone'),
            role_id=role_id,
            currency=user_data.get('currency', 'EUR'),
            is_active=user_data.get('is_active', True)
        )
        db.add(user)
        print(f'  ✓ Created user: {user_data["email"]} ({role_name}) - Password: {password}')
        created_count += 1
    
    db.commit()
    print(f'\n✓ Users seeded successfully!')
    print(f'  - Created: {created_count} user(s)')
    print(f'  - Skipped: {skipped_count} user(s) (already exist)')
    print('=' * 80)

def main():
    db = get_db()
    try:
        seed_users(db)
    except Exception as e:
        print(f'\n❌ Error: {e}')
        import traceback
        traceback.print_exc()
        db.rollback()
    finally:
        db.close()

if __name__ == '__main__':
    main()

