from django.db import models


class Business(models.Model):
    """Maps to table `businesses` (column names match your INSERT list)."""

    business_id = models.BigAutoField(primary_key=True)
    business_name = models.CharField(max_length=255)
    avail_min = models.IntegerField(null=True, blank=True)
    remain_min = models.IntegerField(null=True, blank=True)
    contact_name = models.CharField(max_length=255, blank=True)
    gst_no = models.CharField(max_length=64, blank=True)
    contact_number = models.CharField(max_length=64, blank=True)
    contact_email = models.CharField(max_length=255, blank=True)
    username = models.CharField(max_length=150, blank=True)
    password = models.CharField(max_length=255, blank=True)
    pan_no = models.CharField(max_length=32, blank=True)
    business_address = models.TextField(blank=True)
    status = models.CharField(max_length=50, blank=True)
    plans = models.TextField(blank=True, null=True, default=None)
    business_time = models.TextField(blank=True)
    # JSON string, e.g. {"enabled": true, "retry_attempt_1": 1, "retry_attempt_2": 24}
    retry_attempt = models.TextField(blank=True, default="{}")
    last_login = models.DateTimeField(null=True, blank=True)
    remember_token = models.CharField(max_length=255, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    mcube_bid = models.CharField(max_length=255, blank=True)
    mcube_agent_id = models.CharField(max_length=255, blank=True)
    auth_token = models.TextField(blank=True)
    tts_model_id = models.CharField(max_length=100, blank=True, default="")
    ch_language = models.TextField(blank=True, default="")
    stt_provider = models.CharField(max_length=100, blank=True, default="")
    tts_provider = models.CharField(max_length=100, blank=True, default="")
    stt_model = models.CharField(max_length=100, blank=True, default="")

    class Meta:
        db_table = "businesses"


class User(models.Model):
    """Maps to table `users` (column names match your INSERT list)."""

    user_id = models.BigAutoField(primary_key=True)
    username = models.CharField(max_length=150)
    name = models.CharField(max_length=255, blank=True)
    email = models.CharField(max_length=255, blank=True)
    email_verified_at = models.DateTimeField(null=True, blank=True)
    password = models.CharField(max_length=255)
    role = models.CharField(max_length=50)
    status = models.CharField(max_length=50, blank=True)
    business = models.ForeignKey(
        Business,
        on_delete=models.CASCADE,
        related_name="users",
        db_column="business_id",
    )
    agent_id = models.CharField(max_length=255, null=True, blank=True)
    remember_token = models.CharField(max_length=255, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "users"
        constraints = [
            models.UniqueConstraint(
                fields=("business", "username"),
                name="uq_users_business_username",
            ),
        ]


class Session(models.Model):
    session_id = models.CharField(max_length=255, unique=True, help_text="Anonymous session id")
    language_preference = models.CharField(max_length=10, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "users_session"


class UserPermissionsProfile(models.Model):
    """
    Store dashboard permissions separately from legacy `users` table.
    `permissions_json` holds a JSON array matching frontend `UserPermission[]`.
    """

    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        related_name="permissions_profile",
        db_column="user_id",
        primary_key=True,
    )
    permissions_json = models.TextField(blank=True, default="[]")
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "users_permissions_profile"


class AuditLog(models.Model):
    """Minimal audit log table for Settings -> Audit Trail UI."""

    audit_id = models.BigAutoField(primary_key=True)
    timestamp = models.DateTimeField(auto_now_add=True)

    user_id = models.CharField(max_length=64, blank=True, default="")
    user_name = models.CharField(max_length=255, blank=True, default="")
    user_role = models.CharField(max_length=64, blank=True, default="")

    action = models.CharField(max_length=64)
    module = models.CharField(max_length=64)
    resource_type = models.CharField(max_length=128, blank=True, default="")
    resource_name = models.CharField(max_length=255, blank=True, null=True)

    description = models.TextField(blank=True, default="")
    severity = models.CharField(max_length=16, blank=True, default="low")
    status = models.CharField(max_length=16, blank=True, default="success")

    ip_address = models.CharField(max_length=64, blank=True, null=True)
    user_agent = models.TextField(blank=True, null=True)

    class Meta:
        db_table = "audit_logs"
