
from django.core.management.base import BaseCommand
from django.contrib.auth.models import User
from django.utils.text import slugify
from django.db import transaction
from tenants.models import Tenant, TenantUser
from settings.models import Shop, Theme
from inventory.models import Category, Product
from customers.models import Customer
from decimal import Decimal
import uuid

class Command(BaseCommand):
    help = 'Setup initial tenant and migrate existing data'

    def add_arguments(self, parser):
        parser.add_argument('--tenant-name', type=str, help='Tenant name', default='Demo Company')
        parser.add_argument('--owner-email', type=str, help='Owner email', default='demo@salesshark.com')
        parser.add_argument('--owner-username', type=str, help='Owner username', default='demo')
        parser.add_argument('--create-demo-data', action='store_true', help='Create demo data')

    def handle(self, *args, **options):
        tenant_name = options.get('tenant_name')
        owner_email = options.get('owner_email')
        owner_username = options.get('owner_username')
        create_demo_data = options.get('create_demo_data')

        try:
            with transaction.atomic():
                # Create or get owner user
                owner, created = User.objects.get_or_create(
                    username=owner_username,
                    defaults={
                        'email': owner_email,
                        'first_name': 'Demo',
                        'last_name': 'User',
                        'is_staff': False,
                        'is_superuser': False
                    }
                )

                if created:
                    owner.set_password('demo123')  # Simple password for demo
                    owner.save()
                    self.stdout.write(self.style.SUCCESS(f'Created owner user: {owner_username}'))
                else:
                    self.stdout.write(f'Owner user already exists: {owner_username}')

                # Create tenant with demo tenant code
                tenant, created = Tenant.objects.get_or_create(
                    tenant_code='demo',
                    defaults={
                        'name': tenant_name,
                        'owner': owner,
                        'contact_email': owner_email,
                        'contact_phone': '+254700000000',
                        'address': 'Demo Address, Nairobi, Kenya',
                        'status': 'trial',  # Start with trial
                        'plan': 'standard'
                    }
                )

                if created:
                    self.stdout.write(self.style.SUCCESS(f'Created tenant: {tenant_name}'))
                else:
                    self.stdout.write(f'Tenant already exists: {tenant_name}')

                # Create tenant user relationship
                tenant_user, created = TenantUser.objects.get_or_create(
                    tenant=tenant,
                    user=owner,
                    defaults={'role': 'owner'}
                )

                # Create default shop for the tenant
                shop, created = Shop.objects.get_or_create(
                    tenant=tenant,
                    defaults={
                        'name': f"{tenant.name} - Main Branch",
                        'address': tenant.address,
                        'phone': tenant.contact_phone,
                        'email': tenant.contact_email,
                        'mpesa_env': 'sandbox',
                    }
                )

                if created:
                    self.stdout.write(self.style.SUCCESS(f'Created default shop: {shop.name}'))

                # Create default theme
                theme, theme_created = Theme.objects.get_or_create(
                    tenant=tenant,
                    defaults={
                        'mode': 'light',
                        'primary_color': '#28a745',
                    }
                )

                if theme_created:
                    self.stdout.write(self.style.SUCCESS('Created default theme settings'))

                # Create demo data if requested
                if create_demo_data:
                    self.create_demo_data(tenant)

                # Output success message with login details
                self.stdout.write(self.style.SUCCESS('\n' + '='*50))
                self.stdout.write(self.style.SUCCESS('DEMO TENANT SETUP COMPLETE'))
                self.stdout.write(self.style.SUCCESS('='*50))
                self.stdout.write(f'Organization: {tenant.name}')
                self.stdout.write(f'Subdomain: {tenant.slug}.salesshark.com:5000')
                self.stdout.write(f'Username: {owner.username}')
                self.stdout.write(f'Password: demo123')
                self.stdout.write(f'Email: {owner.email}')
                self.stdout.write(f'Status: {tenant.get_status_display()}')
                self.stdout.write(f'Plan: {tenant.get_plan_display()}')
                self.stdout.write(f'Trial ends: {tenant.trial_ends_at}')
                self.stdout.write('\n' + 'Access Instructions:')
                self.stdout.write('1. Go to: http://{}.salesshark.com:5000'.format(tenant.slug))
                self.stdout.write('2. Login with the credentials above')
                self.stdout.write('3. Or access admin at: http://localhost:5000/system-admin/')
                self.stdout.write('='*50)

        except Exception as e:
            self.stdout.write(self.style.ERROR(f'Error creating tenant: {str(e)}'))
            raise e

    def create_demo_data(self, tenant):
        """Create sample data for demo tenant"""
        from inventory.models import Category, Product
        from customers.models import Customer
        
        # Create sample categories
        categories_data = [
            'Electronics', 'Clothing', 'Books', 'Home & Garden', 'Sports'
        ]
        
        for cat_name in categories_data:
            Category.objects.get_or_create(
                name=cat_name,
                tenant=tenant
            )
        
        # Create sample products
        electronics_cat = Category.objects.filter(name='Electronics', tenant=tenant).first()
        if electronics_cat:
            products_data = [
                {'name': 'Laptop Computer', 'price': 75000, 'stock': 10},
                {'name': 'Smartphone', 'price': 25000, 'stock': 25},
                {'name': 'Tablet', 'price': 35000, 'stock': 15},
                {'name': 'Headphones', 'price': 5000, 'stock': 50},
                {'name': 'Mouse', 'price': 1500, 'stock': 30},
            ]
            
            for product_data in products_data:
                Product.objects.get_or_create(
                    name=product_data['name'],
                    tenant=tenant,
                    defaults={
                        'category': electronics_cat,
                        'price': Decimal(str(product_data['price'])),
                        'cost': Decimal(str(product_data['price'] * 0.7)),  # 30% markup
                        'stock_quantity': product_data['stock'],
                        'sku': f"DEMO-{product_data['name'][:3].upper()}-{uuid.uuid4().hex[:6]}"
                    }
                )
        
        # Create sample customers
        customers_data = [
            {'name': 'John Doe', 'email': 'john@example.com', 'phone': '+254712345678'},
            {'name': 'Jane Smith', 'email': 'jane@example.com', 'phone': '+254723456789'},
            {'name': 'Bob Wilson', 'email': 'bob@example.com', 'phone': '+254734567890'},
        ]
        
        for customer_data in customers_data:
            Customer.objects.get_or_create(
                email=customer_data['email'],
                tenant=tenant,
                defaults={
                    'name': customer_data['name'],
                    'phone': customer_data['phone'],
                }
            )
        
        self.stdout.write(self.style.SUCCESS('Created demo data (categories, products, customers)'))
