"""
CODH Deployments Models
Application deployment management
"""

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


class Deployment(models.Model):
    """
    Application deployments
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='deployments')
    project = models.ForeignKey('projects.Project', on_delete=models.CASCADE, related_name='deployments')
    hosting_account = models.ForeignKey('hosting.HostingAccount', on_delete=models.CASCADE, related_name='deployments')
    
    # Deployment Details
    name = models.CharField(max_length=255)
    
    DEPLOYMENT_TYPES = [
        ('wordpress', 'WordPress'),
        ('static', 'Static Site'),
        ('php', 'PHP Application'),
        ('nodejs', 'Node.js Application'),
        ('python', 'Python Application'),
        ('custom', 'Custom'),
    ]
    deployment_type = models.CharField(max_length=20, choices=DEPLOYMENT_TYPES)
    
    # Source
    source_type = models.CharField(max_length=50, default='git')  # git, zip, ftp
    source_url = models.URLField(blank=True)
    source_branch = models.CharField(max_length=100, default='main')
    
    # Status
    STATUS_CHOICES = [
        ('pending', 'Pending'),
        ('preparing', 'Preparing'),
        ('building', 'Building'),
        ('deploying', 'Deploying'),
        ('verifying', 'Verifying'),
        ('completed', 'Completed'),
        ('failed', 'Failed'),
        ('rolled_back', 'Rolled Back'),
    ]
    status = models.CharField(max_length=15, choices=STATUS_CHOICES, default='pending')
    
    # Progress
    progress_percent = models.IntegerField(default=0)
    current_step = models.CharField(max_length=255, blank=True)
    
    # Build info
    build_log = models.TextField(blank=True)
    error_log = models.TextField(blank=True)
    
    # Deployment info
    deployed_version = models.CharField(max_length=100, blank=True)
    deployed_commit = models.CharField(max_length=100, blank=True)
    deployed_at = models.DateTimeField(null=True, blank=True)
    
    # Rollback
    can_rollback = models.BooleanField(default=False)
    previous_version = models.CharField(max_length=100, blank=True)
    
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    class Meta:
        verbose_name = 'Deployment'
        verbose_name_plural = 'Deployments'
        ordering = ['-created_at']
    
    def __str__(self):
        return f"{self.name} ({self.get_status_display()})"


class DeploymentStep(models.Model):
    """
    Individual deployment steps
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
    deployment = models.ForeignKey(Deployment, on_delete=models.CASCADE, related_name='steps')
    
    name = models.CharField(max_length=255)
    description = models.TextField(blank=True)
    
    order = models.IntegerField(default=0)
    
    STATUS_CHOICES = [
        ('pending', 'Pending'),
        ('running', 'Running'),
        ('completed', 'Completed'),
        ('failed', 'Failed'),
        ('skipped', 'Skipped'),
    ]
    status = models.CharField(max_length=15, choices=STATUS_CHOICES, default='pending')
    
    output = models.TextField(blank=True)
    error = models.TextField(blank=True)
    
    started_at = models.DateTimeField(null=True, blank=True)
    completed_at = models.DateTimeField(null=True, blank=True)
    
    class Meta:
        verbose_name = 'Deployment Step'
        verbose_name_plural = 'Deployment Steps'
        ordering = ['order']


class DeploymentEnvironment(models.Model):
    """
    Environment variables for deployments
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
    deployment = models.ForeignKey(Deployment, on_delete=models.CASCADE, related_name='environments')
    
    name = models.CharField(max_length=100)
    value = models.TextField()
    is_secret = models.BooleanField(default=False)
    
    created_at = models.DateTimeField(auto_now_add=True)
    
    class Meta:
        verbose_name = 'Deployment Environment'
        verbose_name_plural = 'Deployment Environments'
