"""
Analytics Service — Models.

مدل‌های سرویس تحلیل و گزارش‌گیری سطح enterprise.
"""

import uuid

from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _

from apps.core.tenant.models import TenantAwareModel


# ═══════════════════════════════════════════════════
# Feature 5.1: Data Aggregation Engine
# ═══════════════════════════════════════════════════

class AggregationType(models.TextChoices):
    COUNT = "count", _("تعداد")
    SUM = "sum", _("جمع")
    AVERAGE = "average", _("میانگین")
    MIN = "min", _("حداقل")
    MAX = "max", _("حداکثر")
    WEIGHTED_AVERAGE = "weighted_avg", _("میانگین وزنی")
    MEDIAN = "median", _("میانه")
    CUSTOM = "custom", _("سفارشی")


class RollupLevel(models.TextChoices):
    ORGANIZATION = "organization", _("سازمان")
    DEPARTMENT = "department", _("واحد سازمانی")
    PORTFOLIO = "portfolio", _("پورتفولیو")
    PROGRAM = "program", _("برنامه")
    PROJECT = "project", _("پروژه")
    TEAM = "team", _("تیم")
    INDIVIDUAL = "individual", _("فردی")


class TrendDirection(models.TextChoices):
    UP = "up", _("صعودی")
    DOWN = "down", _("نزولی")
    FLAT = "flat", _("ثابت")
    VOLATILE = "volatile", _("نوسانی")


class ReportFormat(models.TextChoices):
    PDF = "pdf", _("PDF")
    EXCEL = "excel", _("Excel")
    CSV = "csv", _("CSV")
    HTML = "html", _("HTML")


class ReportStatus(models.TextChoices):
    PENDING = "pending", _("در انتظار")
    GENERATING = "generating", _("در حال تولید")
    COMPLETED = "completed", _("تکمیل‌شده")
    FAILED = "failed", _("خطا")


class AggregationDefinition(TenantAwareModel):
    """تعریف تجمیع داده — چه داده‌ای، از چه منبعی، با چه روشی."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(_("نام"), max_length=255)
    description = models.TextField(_("توضیحات"), blank=True, default="")
    source_module = models.CharField(
        _("ماژول منبع"), max_length=100,
        help_text=_("مثال: pm, ppm, strategy, hrm"),
    )
    source_entity = models.CharField(
        _("موجودیت منبع"), max_length=100,
        help_text=_("مثال: project, portfolio, kpi_actual"),
    )
    aggregation_type = models.CharField(
        _("نوع تجمیع"), max_length=20,
        choices=AggregationType.choices, default=AggregationType.COUNT,
    )
    aggregation_field = models.CharField(
        _("فیلد تجمیع"), max_length=100, blank=True, default="",
        help_text=_("فیلدی که تجمیع روی آن اعمال می‌شود"),
    )
    filter_criteria = models.JSONField(
        _("معیارهای فیلتر"), default=dict, blank=True,
        help_text=_("فیلترهای اعمال‌شده قبل از تجمیع"),
    )
    group_by = models.JSONField(
        _("گروه‌بندی"), default=list, blank=True,
        help_text=_("فیلدهای گروه‌بندی"),
    )
    schedule = models.CharField(
        _("زمان‌بندی"), max_length=100, blank=True, default="",
        help_text=_("Cron expression یا preset: daily, weekly, monthly"),
    )
    is_active = models.BooleanField(_("فعال"), default=True)
    metadata = models.JSONField(_("متادیتا"), default=dict, blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        app_label = "analytics"
        db_table = "anl_aggregation_def"
        verbose_name = _("تعریف تجمیع")
        verbose_name_plural = _("تعریف‌های تجمیع")

    def __str__(self):
        return f"{self.name} ({self.source_module}.{self.source_entity})"


class AggregationSnapshot(TenantAwareModel):
    """اسنپ‌شات دوره‌ای — ذخیره نتایج تجمیع."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    definition = models.ForeignKey(
        AggregationDefinition, on_delete=models.CASCADE,
        related_name="snapshots", verbose_name=_("تعریف تجمیع"),
    )
    snapshot_date = models.DateField(_("تاریخ اسنپ‌شات"))
    data = models.JSONField(
        _("داده تجمیع‌شده"), default=dict,
        help_text=_("نتایج تجمیع به صورت JSON"),
    )
    record_count = models.PositiveIntegerField(_("تعداد رکوردها"), default=0)
    execution_time_ms = models.PositiveIntegerField(
        _("زمان اجرا (میلی‌ثانیه)"), default=0,
    )
    metadata = models.JSONField(_("متادیتا"), default=dict, blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        app_label = "analytics"
        db_table = "anl_aggregation_snap"
        verbose_name = _("اسنپ‌شات تجمیع")
        verbose_name_plural = _("اسنپ‌شات‌های تجمیع")
        ordering = ["-snapshot_date"]

    def __str__(self):
        return f"{self.definition.name} @ {self.snapshot_date}"


class KPIRollup(TenantAwareModel):
    """تجمیع KPI — از سطح فردی تا سطح سازمان."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    kpi_code = models.CharField(_("کد KPI"), max_length=50)
    kpi_name = models.CharField(_("نام KPI"), max_length=255, blank=True, default="")
    level = models.CharField(
        _("سطح"), max_length=20,
        choices=RollupLevel.choices, default=RollupLevel.ORGANIZATION,
    )
    entity_id = models.UUIDField(
        _("شناسه موجودیت"), null=True, blank=True,
        help_text=_("شناسه واحد/پورتفولیو/پروژه مربوطه"),
    )
    period = models.CharField(
        _("دوره"), max_length=20,
        help_text=_("مثال: 2026-Q1, 2026-01"),
    )
    value = models.DecimalField(
        _("مقدار"), max_digits=20, decimal_places=4, default=0,
    )
    previous_value = models.DecimalField(
        _("مقدار قبلی"), max_digits=20, decimal_places=4, null=True, blank=True,
    )
    target_value = models.DecimalField(
        _("مقدار هدف"), max_digits=20, decimal_places=4, null=True, blank=True,
    )
    trend = models.CharField(
        _("روند"), max_length=20,
        choices=TrendDirection.choices, default=TrendDirection.FLAT,
    )
    change_percentage = models.DecimalField(
        _("درصد تغییر"), max_digits=10, decimal_places=2, null=True, blank=True,
    )
    metadata = models.JSONField(_("متادیتا"), default=dict, blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        app_label = "analytics"
        db_table = "anl_kpi_rollup"
        verbose_name = _("تجمیع KPI")
        verbose_name_plural = _("تجمیع‌های KPI")
        unique_together = [("tenant", "kpi_code", "level", "entity_id", "period")]

    def __str__(self):
        return f"{self.kpi_code} [{self.level}] — {self.period}: {self.value}"


# ═══════════════════════════════════════════════════
# Feature 5.3: Cross-Module Report Generator
# ═══════════════════════════════════════════════════

class ReportTemplate(TenantAwareModel):
    """قالب گزارش — تعریف ساختار و کوئری گزارش."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(_("نام قالب"), max_length=255)
    description = models.TextField(_("توضیحات"), blank=True, default="")
    modules = models.JSONField(
        _("ماژول‌ها"), default=list,
        help_text=_("لیست ماژول‌های منبع داده"),
    )
    query_definition = models.JSONField(
        _("تعریف کوئری"), default=dict,
        help_text=_("ساختار کوئری برای استخراج داده"),
    )
    format_options = models.JSONField(
        _("گزینه‌های فرمت"), default=dict,
        help_text=_("تنظیمات فرمت خروجی (ستون‌ها، فیلترها، ...)"),
    )
    default_format = models.CharField(
        _("فرمت پیش‌فرض"), max_length=10,
        choices=ReportFormat.choices, default=ReportFormat.PDF,
    )
    is_scheduled = models.BooleanField(_("زمان‌بندی‌شده"), default=False)
    schedule = models.CharField(
        _("زمان‌بندی"), max_length=100, blank=True, default="",
        help_text=_("Cron expression"),
    )
    owner = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="report_templates",
        verbose_name=_("ایجادکننده"),
    )
    is_active = models.BooleanField(_("فعال"), default=True)
    metadata = models.JSONField(_("متادیتا"), default=dict, blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        app_label = "analytics"
        db_table = "anl_report_template"
        verbose_name = _("قالب گزارش")
        verbose_name_plural = _("قالب‌های گزارش")

    def __str__(self):
        return self.name


class GeneratedReport(TenantAwareModel):
    """گزارش تولیدشده — خروجی اجرای قالب گزارش."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    template = models.ForeignKey(
        ReportTemplate, on_delete=models.CASCADE,
        related_name="generated_reports", verbose_name=_("قالب"),
    )
    title = models.CharField(_("عنوان"), max_length=255, blank=True, default="")
    parameters = models.JSONField(
        _("پارامترها"), default=dict, blank=True,
        help_text=_("پارامترهای ورودی هنگام تولید"),
    )
    format = models.CharField(
        _("فرمت"), max_length=10,
        choices=ReportFormat.choices, default=ReportFormat.PDF,
    )
    status = models.CharField(
        _("وضعیت"), max_length=20,
        choices=ReportStatus.choices, default=ReportStatus.PENDING,
    )
    file_url = models.URLField(
        _("آدرس فایل"), blank=True, default="",
        help_text=_("آدرس فایل خروجی در storage"),
    )
    file_size = models.PositiveIntegerField(
        _("حجم فایل (بایت)"), null=True, blank=True,
    )
    generated_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="generated_reports",
        verbose_name=_("تولیدکننده"),
    )
    generated_at = models.DateTimeField(_("تاریخ تولید"), null=True, blank=True)
    error_message = models.TextField(_("پیام خطا"), blank=True, default="")
    metadata = models.JSONField(_("متادیتا"), default=dict, blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        app_label = "analytics"
        db_table = "anl_generated_report"
        verbose_name = _("گزارش تولیدشده")
        verbose_name_plural = _("گزارش‌های تولیدشده")
        ordering = ["-generated_at"]

    def __str__(self):
        return f"{self.template.name} — {self.generated_at or 'pending'}"
