from django.db import models
from django.contrib.auth import get_user_model
from apps.common.models import BaseModel


class Advertiser(BaseModel):
    """Advertiser/Client model."""
    ADVERTISER_TYPES = [
        ("direct", "Direct Client"),
        ("agency", "Agency Client"),
        ("network", "Network Client"),
    ]
    
    name = models.CharField(max_length=255)
    company_name = models.CharField(max_length=255, blank=True)
    advertiser_type = models.CharField(max_length=20, choices=ADVERTISER_TYPES, default="direct")
    
    # Contact Information
    contact_person = models.CharField(max_length=255, blank=True)
    email = models.EmailField(blank=True)
    phone = models.CharField(max_length=20, blank=True)
    website = models.URLField(blank=True)
    
    # Address
    address_line1 = models.CharField(max_length=255, blank=True)
    address_line2 = models.CharField(max_length=255, blank=True)
    city = models.CharField(max_length=100, blank=True)
    state = models.CharField(max_length=100, blank=True)
    postal_code = models.CharField(max_length=20, blank=True)
    country = models.CharField(max_length=100, blank=True)
    
    # Business Information
    tax_id = models.CharField(max_length=50, blank=True)
    industry = models.CharField(max_length=100, blank=True)
    
    # Account Settings
    is_active = models.BooleanField(default=True)
    credit_limit = models.DecimalField(max_digits=12, decimal_places=2, null=True, blank=True)
    payment_terms = models.CharField(max_length=100, blank=True, help_text="e.g., Net 30, Net 60")
    
    # Relationships
    account_manager = models.ForeignKey(
        "accounts.User", 
        on_delete=models.SET_NULL, 
        null=True, 
        blank=True, 
        related_name="managed_advertisers"
    )
    parent_agency = models.ForeignKey(
        "campaigns.Agency", 
        on_delete=models.SET_NULL, 
        null=True, 
        blank=True, 
        related_name="advertisers"
    )
    
    class Meta:
        db_table = "advertisers"
        ordering = ["name"]
    
    def __str__(self):
        return self.name
    
    @property
    def full_address(self):
        """Return formatted full address."""
        address_parts = []
        if self.address_line1:
            address_parts.append(self.address_line1)
        if self.address_line2:
            address_parts.append(self.address_line2)
        if self.city:
            address_parts.append(self.city)
        if self.state:
            address_parts.append(self.state)
        if self.postal_code:
            address_parts.append(self.postal_code)
        if self.country:
            address_parts.append(self.country)
        return ", ".join(address_parts)
    
    def get_total_campaigns(self):
        """Get total number of campaigns for this advertiser."""
        return self.brands.aggregate(
            total=models.Count("campaigns")
        )["total"] or 0
    
    def get_active_campaigns(self):
        """Get number of active campaigns."""
        from django.utils import timezone
        now = timezone.now()
        return self.brands.filter(
            campaigns__status="active",
            campaigns__start_date__lte=now,
            campaigns__end_date__gte=now
        ).aggregate(
            total=models.Count("campaigns")
        )["total"] or 0


class AdvertiserContact(BaseModel):
    """Additional contacts for advertisers."""
    CONTACT_TYPES = [
        ("primary", "Primary Contact"),
        ("billing", "Billing Contact"),
        ("technical", "Technical Contact"),
        ("marketing", "Marketing Contact"),
    ]
    
    advertiser = models.ForeignKey(Advertiser, on_delete=models.CASCADE, related_name="contacts")
    contact_type = models.CharField(max_length=20, choices=CONTACT_TYPES)
    
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    title = models.CharField(max_length=100, blank=True)
    email = models.EmailField()
    phone = models.CharField(max_length=20, blank=True)
    mobile = models.CharField(max_length=20, blank=True)
    
    is_primary = models.BooleanField(default=False)
    receive_reports = models.BooleanField(default=True)
    receive_notifications = models.BooleanField(default=True)
    
    class Meta:
        db_table = "advertiser_contacts"
        ordering = ["advertiser", "contact_type", "last_name"]
    
    def __str__(self):
        return f"{self.first_name} {self.last_name} ({self.advertiser.name})"
    
    @property
    def full_name(self):
        return f"{self.first_name} {self.last_name}"


class UserAdvertiser(BaseModel):
    """Many-to-many relationship between users and advertisers with permissions."""
    PERMISSION_LEVELS = [
        ("view", "View Only"),
        ("edit", "Edit"),
        ("manage", "Full Management"),
    ]
    
    user = models.ForeignKey("accounts.User", on_delete=models.CASCADE, related_name="advertiser_access")
    advertiser = models.ForeignKey(Advertiser, on_delete=models.CASCADE, related_name="user_access")
    permission_level = models.CharField(max_length=20, choices=PERMISSION_LEVELS, default="view")
    
    # Specific permissions
    can_view_campaigns = models.BooleanField(default=True)
    can_create_campaigns = models.BooleanField(default=False)
    can_edit_campaigns = models.BooleanField(default=False)
    can_approve_campaigns = models.BooleanField(default=False)
    can_view_reports = models.BooleanField(default=True)
    can_manage_creatives = models.BooleanField(default=False)
    
    granted_by = models.ForeignKey(
        "accounts.User", 
        on_delete=models.SET_NULL, 
        null=True, 
        related_name="granted_advertiser_access"
    )
    
    class Meta:
        db_table = "user_advertisers"
        unique_together = ["user", "advertiser"]
        ordering = ["advertiser", "user"]
    
    def __str__(self):
        return f"{self.user.username} - {self.advertiser.name} ({self.permission_level})"
    
    def has_permission(self, permission):
        """Check if user has specific permission."""
        permission_map = {
            "view_campaigns": self.can_view_campaigns,
            "create_campaigns": self.can_create_campaigns,
            "edit_campaigns": self.can_edit_campaigns,
            "approve_campaigns": self.can_approve_campaigns,
            "view_reports": self.can_view_reports,
            "manage_creatives": self.can_manage_creatives,
        }
        return permission_map.get(permission, False)


class AdvertiserBilling(BaseModel):
    """Billing information for advertisers."""
    BILLING_METHODS = [
        ("credit_card", "Credit Card"),
        ("bank_transfer", "Bank Transfer"),
        ("check", "Check"),
        ("invoice", "Invoice"),
    ]
    
    advertiser = models.OneToOneField(Advertiser, on_delete=models.CASCADE, related_name="billing")
    
    billing_method = models.CharField(max_length=20, choices=BILLING_METHODS, default="invoice")
    
    # Credit Card (encrypted/tokenized)
    card_last_four = models.CharField(max_length=4, blank=True)
    card_type = models.CharField(max_length=20, blank=True)
    card_expiry = models.CharField(max_length=7, blank=True)  # MM/YYYY
    
    # Bank Details
    bank_name = models.CharField(max_length=255, blank=True)
    account_number = models.CharField(max_length=50, blank=True)
    routing_number = models.CharField(max_length=50, blank=True)
    swift_code = models.CharField(max_length=20, blank=True)
    
    # Billing Address (if different from main address)
    billing_address_line1 = models.CharField(max_length=255, blank=True)
    billing_address_line2 = models.CharField(max_length=255, blank=True)
    billing_city = models.CharField(max_length=100, blank=True)
    billing_state = models.CharField(max_length=100, blank=True)
    billing_postal_code = models.CharField(max_length=20, blank=True)
    billing_country = models.CharField(max_length=100, blank=True)
    
    # Settings
    auto_pay = models.BooleanField(default=False)
    billing_threshold = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    
    class Meta:
        db_table = "advertiser_billing"
    
    def __str__(self):
        return f"Billing for {self.advertiser.name}"


class AdvertiserNote(BaseModel):
    """Notes and comments about advertisers."""
    advertiser = models.ForeignKey(Advertiser, on_delete=models.CASCADE, related_name="notes")
    user = models.ForeignKey("accounts.User", on_delete=models.CASCADE)
    
    title = models.CharField(max_length=255, blank=True)
    content = models.TextField()
    is_important = models.BooleanField(default=False)
    is_private = models.BooleanField(default=False)
    
    class Meta:
        db_table = "advertiser_notes"
        ordering = ["-created_at"]
    
    def __str__(self):
        return f"Note for {self.advertiser.name} by {self.user.username}"