from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.models import User
from django.contrib.auth import login
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.conf import settings
from django.utils.text import slugify
from django.db import transaction
from django.utils import timezone
from tenants.models import Tenant, TenantUser
from settings.models import Shop
from analytics.models import SignupAttempt, ContactSubmission
import uuid
import secrets
import string


def landing_page(request):
    """Public landing page for salesshark.com"""
    context = {
        'contact_phone': '+254 796374224',
        'contact_email': 'info@salesshark.com',
        'support_email': 'support@salesshark.com',
    }
    return render(request, 'landing/index.html', context)


def about(request):
    """About page"""
    context = {
        'contact_phone': '+254 796374224',
        'contact_email': 'info@salesshark.com',
        'support_email': 'support@salesshark.com',
    }
    return render(request, 'landing/about.html', context)


def features(request):
    """Features page"""
    return render(request, 'landing/features.html')


def pricing(request):
    """Pricing page"""
    return render(request, 'landing/pricing.html')


def contact(request):
    """Contact page"""
    if request.method == 'POST':
        name = request.POST.get('name')
        email = request.POST.get('email')
        message = request.POST.get('message')

        # Get visitor information
        ip_address = get_client_ip(request)
        user_agent = request.META.get('HTTP_USER_AGENT', '')

        # Track contact submission
        contact_submission = ContactSubmission.objects.create(
            name=name,
            email=email,
            message=message,
            ip_address=ip_address,
            user_agent=user_agent
        )

        # Send contact email
        try:
            send_mail(
                subject=f'Contact Form Submission from {name}',
                message=f'Name: {name}\nEmail: {email}\n\nMessage:\n{message}',
                from_email=settings.DEFAULT_FROM_EMAIL,
                recipient_list=['info@salesshark.com'],
                fail_silently=False,
            )
            messages.success(request, 'Thank you for your message. We will get back to you soon!')
        except Exception as e:
            messages.error(request, 'There was an error sending your message. Please try again.')

        return redirect('landing:contact')

    context = {
        'contact_phone': '+254 796374224',
        'contact_email': 'info@salesshark.com',
        'support_email': 'support@salesshark.com',
    }
    return render(request, 'landing/contact.html', context)


def tenant_signup(request):
    """Tenant self-registration"""
    if request.method == 'POST':
        # Get form data
        business_name = request.POST.get('business_name')
        owner_first_name = request.POST.get('owner_first_name')
        owner_last_name = request.POST.get('owner_last_name')
        email = request.POST.get('email')
        phone = request.POST.get('phone')
        address = request.POST.get('address', '')
        username = request.POST.get('username')

        # Get visitor information for analytics
        ip_address = get_client_ip(request)
        user_agent = request.META.get('HTTP_USER_AGENT', '')
        owner_full_name = f"{owner_first_name} {owner_last_name}"

        # Create signup attempt record
        signup_attempt = SignupAttempt.objects.create(
            business_name=business_name,
            email=email,
            phone=phone,
            owner_name=owner_full_name,
            ip_address=ip_address,
            user_agent=user_agent,
            status='pending'
        )

        # Validate required fields
        if not all([business_name, owner_first_name, owner_last_name, email, phone, username]):
            signup_attempt.status = 'failed'
            signup_attempt.error_message = 'Missing required fields'
            signup_attempt.save()
            messages.error(request, 'Please fill in all required fields.')
            return render(request, 'landing/signup.html')

        # Check if username or email already exists
        if User.objects.filter(username=username).exists():
            signup_attempt.status = 'failed'
            signup_attempt.error_message = 'Username already exists'
            signup_attempt.save()
            messages.error(request, 'Username already exists. Please choose a different one.')
            return render(request, 'landing/signup.html')

        if User.objects.filter(email=email).exists():
            signup_attempt.status = 'failed'
            signup_attempt.error_message = 'Email already exists'
            signup_attempt.save()
            messages.error(request, 'Email already exists. Please use a different email.')
            return render(request, 'landing/signup.html')

        # Generate tenant code
        tenant_code = str(uuid.uuid4().hex)[:8].upper()  # Generate an 8-character unique tenant code
        while Tenant.objects.filter(tenant_code=tenant_code).exists():
            tenant_code = str(uuid.uuid4().hex)[:8].upper()

        try:
            with transaction.atomic():
                # Generate random password
                alphabet = string.ascii_letters + string.digits + "!@#$%&*"
                password = ''.join(secrets.choice(alphabet) for i in range(12))

                # Create user
                user = User.objects.create_user(
                    username=username,
                    email=email,
                    first_name=owner_first_name,
                    last_name=owner_last_name,
                    password=password
                )

                # Create tenant
                tenant = Tenant.objects.create(
                    name=business_name,
                    tenant_code=tenant_code,  # Assign the generated tenant code
                    owner=user,
                    contact_email=email,
                    contact_phone=phone,
                    address=address,
                    status='trial'
                )

                # Create tenant user relationship
                TenantUser.objects.create(
                    tenant=tenant,
                    user=user,
                    role='owner'
                )

                # Create default shop for the tenant
                Shop.objects.create(
                    name=business_name,
                    phone=phone,
                    email=email,
                    address=address,
                    tenant=tenant
                )

                # Send welcome email with login credentials and tenant code
                send_welcome_email(user, tenant, password, tenant_code)

                messages.success(
                    request,
                    f'Congratulations! Your account has been created. '
                    f'Your Tenant Code is: {tenant_code}. '
                    f'Login credentials have been sent to {email}. '
                    f'You have a 14-day free trial to explore all features.'
                )

                # Update signup attempt as successful
                signup_attempt.status = 'success'
                signup_attempt.tenant = tenant
                signup_attempt.save()

                # Auto-login the user (specify backend to avoid authentication error)
                login(request, user, backend='django.contrib.auth.backends.ModelBackend')
                return redirect('dashboard')

        except Exception as e:
            # Update signup attempt as failed (don't reference tenant as it may have been rolled back)
            signup_attempt.status = 'failed'
            signup_attempt.error_message = str(e)
            signup_attempt.tenant = None  # Clear tenant reference to avoid foreign key constraint error
            signup_attempt.save()
            messages.error(request, f'An error occurred while creating your account: {str(e)}')
            return render(request, 'landing/signup.html')

    return render(request, 'landing/signup.html')


def get_client_ip(request):
    """Get the real IP address of the client"""
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0].strip()
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip


def send_welcome_email(user, tenant, password, tenant_code):
    """Send welcome email with login credentials and tenant code"""
    subject = f'Welcome to Sales Shark - Your Account is Ready!'

    context = {
        'user': user,
        'tenant': tenant,
        'password': password,
        'tenant_code': tenant_code,
        'login_url': 'https://salesshark.com/auth/login/',
        'support_email': 'support@salesshark.com',
        'contact_phone': '+254 796374224',
    }

    # Render email templates
    try:
        html_message = render_to_string('landing/emails/welcome_email.html', context)
        
        # Create plain text version
        plain_message = f'''Welcome to Sales Shark!

Hello {user.first_name}!

Your organization: {tenant.name}
Tenant Code: {tenant_code}
Username: {user.username}
Password: {password}

Login at: https://salesshark.com/auth/login/

Need help? Contact our support team:
Email: support@salesshark.com
Phone: +254 796374224

Thank you for choosing Sales Shark!'''

        send_mail(
            subject=subject,
            message=plain_message,
            from_email='pos@optinet.co.ke',
            recipient_list=[user.email],
            html_message=html_message,
            fail_silently=False,
        )
    except Exception as e:
        print(f"Email sending failed: {str(e)}")
        raise e


def terms_of_service(request):
    """Terms of Service page"""
    return render(request, 'landing/terms.html')


def privacy_policy(request):
    """Privacy Policy page"""
    return render(request, 'landing/privacy.html')


def demo_access(request):
    """Direct demo access without login"""
    if request.method == 'POST':
        name = request.POST.get('name')
        email = request.POST.get('email')
        phone = request.POST.get('phone')
        
        if not all([name, email, phone]):
            messages.error(request, 'Please fill in all fields.')
            return render(request, 'landing/demo_access.html')
        
        # Store demo access info in session for analytics
        request.session['demo_user'] = {
            'name': name,
            'email': email,
            'phone': phone,
            'access_time': timezone.now().isoformat()
        }
        
        # Log in as demo user and redirect to dashboard
        try:
            # Get or create demo tenant and user
            demo_tenant = Tenant.objects.get(tenant_code='DEMO')
            demo_user = User.objects.get(username='demo_user')
            
            # Log in the demo user
            login(request, demo_user)
            request.session['tenant_code'] = demo_tenant.tenant_code
            
            messages.success(request, f'Welcome to Sales Shark Demo, {name}! Explore all features.')
            return redirect('dashboard')
            
        except (Tenant.DoesNotExist, User.DoesNotExist):
            messages.error(request, 'Demo system is temporarily unavailable. Please try again later.')
            return render(request, 'landing/demo_access.html')
    
    return render(request, 'landing/demo_access.html')