from django.db import models
from django.utils.text import slugify


class Client(models.Model):
    name = models.CharField(max_length=120, unique=True)
    slug = models.SlugField(max_length=120, unique=True)
    subdomain = models.SlugField(max_length=120, unique=True, null=True, blank=True)
    # Shown on login and app header; blank falls back to `name`.
    company_display_name = models.CharField(max_length=200, blank=True, default="")
    logo = models.FileField(upload_to="client_logos/%Y/%m/", blank=True, null=True)
    use_demo_data = models.BooleanField(default=False)
    # Xero OAuth (optional). When all three are set, XeroService uses DB credentials instead of .env.
    xero_oauth_client_id = models.CharField(max_length=120, blank=True, default="")
    xero_oauth_client_secret = models.TextField(blank=True, default="")
    xero_oauth_refresh_token = models.TextField(blank=True, default="")
    # Feature flags: e.g. {"job_efficiency_csv": true} for Nixon CSV-based job efficiency.
    features = models.JSONField(default=dict, blank=True)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "clients"

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        if not self.subdomain:
            self.subdomain = self.slug
        super().save(*args, **kwargs)

    def branding_company_name(self) -> str:
        s = (self.company_display_name or "").strip()
        return s or self.name

    def __str__(self):
        return f"{self.name} ({self.subdomain})"


class ClientBranch(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name="branches")
    branch_id = models.CharField(max_length=50)
    branch_name = models.CharField(max_length=100)

    # SimPRO config
    simpro_api_url = models.CharField(max_length=255, blank=True, default="")
    simpro_api_key = models.CharField(max_length=255, blank=True, default="")

    # Xero config
    xero_enabled = models.BooleanField(default=False)
    xero_tenant_id = models.CharField(max_length=120, blank=True, default="")
    xero_tracking_category_name = models.CharField(max_length=120, default="Business Groups")
    # dept -> option string or list[str]
    xero_department_to_option = models.JSONField(default=dict, blank=True)
    # dept -> company_id
    xero_department_to_company_id = models.JSONField(default=dict, blank=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "client_branches"
        unique_together = (("client", "branch_id"),)

    def __str__(self):
        return f"{self.client.slug}:{self.branch_id}"


class ClientUserMembership(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name="memberships")
    user = models.ForeignKey("accounts.User", on_delete=models.CASCADE, related_name="client_memberships")
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = "client_user_memberships"
        unique_together = (("client", "user"),)

    def __str__(self):
        return f"{self.client.slug}:{self.user.username}"
