"""
CODH Hosting Models
Hosting account and package management
"""

import uuid
from django.db import models
from django.conf import settings


class HostingPackage(models.Model):
    """
    Hosting package definitions
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
    name = models.CharField(max_length=255)
    description = models.TextField(blank=True)
    
    # Resources
    disk_space_mb = models.IntegerField(default=1000)  # MB
    bandwidth_mb = models.IntegerField(default=10000)  # MB per month
    
    # Features
    ftp_accounts = models.IntegerField(default=1)
    email_accounts = models.IntegerField(default=5)
    databases = models.IntegerField(default=1)
    subdomains = models.IntegerField(default=0)
    addon_domains = models.IntegerField(default=0)
    
    # Technical
    php_versions = models.JSONField(default=list, blank=True)
    ssl_included = models.BooleanField(default=True)
    backup_included = models.BooleanField(default=False)
    
    # Pricing
    monthly_price = models.DecimalField(max_digits=10, decimal_places=2)
    yearly_price = models.DecimalField(max_digits=10, decimal_places=2)
    setup_fee = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    
    # Provider mapping
    PROVIDER_CHOICES = [
        ('mofh', 'MyOwnFreeHost'),
        ('vpstc', 'VPS.TC'),
        ('custom', 'Custom'),
    ]
    provider = models.CharField(max_length=10, choices=PROVIDER_CHOICES, default='mofh')
    provider_package_id = models.CharField(max_length=100, blank=True)
    
    is_active = models.BooleanField(default=True)
    is_public = models.BooleanField(default=True)
    
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    class Meta:
        verbose_name = 'Hosting Package'
        verbose_name_plural = 'Hosting Packages'
        ordering = ['monthly_price']
    
    def __str__(self):
        return self.name


class HostingAccount(models.Model):
    """
    User hosting accounts
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='hosting_accounts')
    package = models.ForeignKey(HostingPackage, on_delete=models.PROTECT, related_name='accounts')
    
    # Account Details
    username = models.CharField(max_length=100, unique=True)
    domain = models.CharField(max_length=255, blank=True)
    
    # Credentials (encrypted)
    password_encrypted = models.BinaryField(null=True, blank=True)
    
    # Server Info
    server_ip = models.GenericIPAddressField(null=True, blank=True)
    nameservers = models.JSONField(default=list, blank=True)
    
    # Control Panel
    cpanel_url = models.URLField(blank=True)
    cpanel_username = models.CharField(max_length=100, blank=True)
    
    # Status
    STATUS_CHOICES = [
        ('pending', 'Pending'),
        ('provisioning', 'Provisioning'),
        ('active', 'Active'),
        ('suspended', 'Suspended'),
        ('cancelled', 'Cancelled'),
        ('error', 'Error'),
    ]
    status = models.CharField(max_length=15, choices=STATUS_CHOICES, default='pending')
    
    # Suspension
    suspended_at = models.DateTimeField(null=True, blank=True)
    suspension_reason = models.TextField(blank=True)
    
    # Usage
    disk_usage_mb = models.IntegerField(default=0)
    bandwidth_usage_mb = models.IntegerField(default=0)
    last_usage_update = models.DateTimeField(null=True, blank=True)
    
    # Provider
    provider_account_id = models.CharField(max_length=255, blank=True)
    
    # Dates
    created_at = models.DateTimeField(auto_now_add=True)
    activated_at = models.DateTimeField(null=True, blank=True)
    expires_at = models.DateTimeField(null=True, blank=True)
    
    class Meta:
        verbose_name = 'Hosting Account'
        verbose_name_plural = 'Hosting Accounts'
        ordering = ['-created_at']
    
    def __str__(self):
        return f"{self.username} ({self.domain})"


class Domain(models.Model):
    """
    Domain management
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='domains')
    hosting_account = models.ForeignKey(HostingAccount, on_delete=models.SET_NULL, null=True, blank=True, related_name='domains')
    
    name = models.CharField(max_length=255)
    
    # Registration
    registrar = models.CharField(max_length=100, blank=True)
    registration_date = models.DateField(null=True, blank=True)
    expiry_date = models.DateField(null=True, blank=True)
    
    # DNS
    nameservers = models.JSONField(default=list, blank=True)
    dns_managed_here = models.BooleanField(default=False)
    
    # Status
    STATUS_CHOICES = [
        ('active', 'Active'),
        ('expired', 'Expired'),
        ('pending', 'Pending Transfer'),
        ('transferred', 'Transferred'),
    ]
    status = models.CharField(max_length=15, choices=STATUS_CHOICES, default='active')
    
    # Privacy
    privacy_protection = models.BooleanField(default=False)
    
    # Auto-renew
    auto_renew = models.BooleanField(default=True)
    
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    class Meta:
        verbose_name = 'Domain'
        verbose_name_plural = 'Domains'
    
    def __str__(self):
        return self.name


class Database(models.Model):
    """
    Database management
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
    hosting_account = models.ForeignKey(HostingAccount, on_delete=models.CASCADE, related_name='databases')
    
    name = models.CharField(max_length=100)
    username = models.CharField(max_length=100)
    password_encrypted = models.BinaryField(null=True, blank=True)
    
    db_type = models.CharField(max_length=20, default='mysql')
    
    size_mb = models.IntegerField(default=0)
    
    created_at = models.DateTimeField(auto_now_add=True)
    
    class Meta:
        verbose_name = 'Database'
        verbose_name_plural = 'Databases'


class EmailAccount(models.Model):
    """
    Email account management
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
    hosting_account = models.ForeignKey(HostingAccount, on_delete=models.CASCADE, related_name='email_accounts')
    
    email = models.EmailField()
    password_encrypted = models.BinaryField(null=True, blank=True)
    
    quota_mb = models.IntegerField(default=100)
    usage_mb = models.IntegerField(default=0)
    
    is_active = models.BooleanField(default=True)
    
    created_at = models.DateTimeField(auto_now_add=True)
    
    class Meta:
        verbose_name = 'Email Account'
        verbose_name_plural = 'Email Accounts'


class SSLCertificate(models.Model):
    """
    SSL Certificate management
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
    domain = models.ForeignKey(Domain, on_delete=models.CASCADE, related_name='ssl_certificates')
    
    certificate_type = models.CharField(max_length=50, default='letsencrypt')
    
    issued_at = models.DateTimeField(null=True, blank=True)
    expires_at = models.DateTimeField(null=True, blank=True)
    
    is_active = models.BooleanField(default=True)
    auto_renew = models.BooleanField(default=True)
    
    certificate_data = models.TextField(blank=True)
    
    created_at = models.DateTimeField(auto_now_add=True)
    
    class Meta:
        verbose_name = 'SSL Certificate'
        verbose_name_plural = 'SSL Certificates'
