from datetime import datetime, time
from decimal import Decimal

from django.db import models
from django.utils import timezone

from shop_management.models.base import DataRoot
from shop_management.models.data.shop import Shop
from shop_management.models.data.utils import Currency


class DailyDiaryEntry(DataRoot):
    """Legacy daily note header — kept for backward compatibility."""

    shop = models.ForeignKey(
        Shop,
        on_delete=models.CASCADE,
        related_name="daily_diary_entries",
    )
    entry_date = models.DateField(default=timezone.localdate)
    title = models.CharField(max_length=255, blank=True, default="")
    content = models.TextField(blank=True, default="")
    is_deleted = models.BooleanField(default=False)

    class Meta:
        ordering = ["-entry_date", "-id"]
        constraints = [
            models.UniqueConstraint(
                fields=["shop", "entry_date"],
                condition=models.Q(is_deleted=False),
                name="unique_active_daily_diary_per_shop_date",
            )
        ]

    def __str__(self):
        return f"Diary {self.entry_date} — {self.shop.name}"


class DailyDiaryLog(DataRoot):
    """Roznamcha (روزنامچه) — one journal line per system event or manual note."""

    class ActivityType(models.TextChoices):
        MANUAL = "manual", "Manual"
        PURCHASE = "purchase", "Purchase"
        SALE = "sale", "Sale"
        QUOTATION = "quotation", "Quotation"
        SALE_PAYMENT = "sale_payment", "Sale Payment Received"
        PURCHASE_PAYMENT = "purchase_payment", "Purchase Payment Paid"
        CUSTOMER_PAYMENT = "customer_payment", "Customer Balance Received"
        SUPPLIER_PAYMENT = "supplier_payment", "Supplier Balance Paid"
        CUSTOMER_DEBTOR = "customer_debtor", "Loan Disbursement"
        STOCK_TRANSFER = "stock_transfer", "Stock Transfer"
        EXPENSE = "expense", "Expense"
        SALE_RETURN = "sale_return", "Sale Return"
        PURCHASE_RETURN = "purchase_return", "Purchase Return"
        PAYROLL = "payroll", "Payroll"
        ADVANCE = "advance", "Advance"
        PASSIVE_INCOME = "passive_income", "Passive Income"
        ACCOUNT_TRANSFER = "account_transfer", "Account Transfer"

    class Category(models.TextChoices):
        """High-level journal section shown in روزنامچه."""
        SALE = "sale", "Sale"
        PURCHASE = "purchase", "Purchase"
        RECEIVABLE = "receivable", "Receivable Payment"
        PAYABLE = "payable", "Payable Payment"
        QUOTATION = "quotation", "Quotation"
        STOCK = "stock", "Stock"
        RETURN = "return", "Return"
        MANUAL = "manual", "Manual"

    ACTIVITY_CATEGORY = {
        ActivityType.MANUAL: Category.MANUAL,
        ActivityType.SALE: Category.SALE,
        ActivityType.PURCHASE: Category.PURCHASE,
        ActivityType.QUOTATION: Category.QUOTATION,
        ActivityType.SALE_PAYMENT: Category.RECEIVABLE,
        ActivityType.CUSTOMER_PAYMENT: Category.RECEIVABLE,
        ActivityType.PASSIVE_INCOME: Category.RECEIVABLE,
        ActivityType.PURCHASE_PAYMENT: Category.PAYABLE,
        ActivityType.SUPPLIER_PAYMENT: Category.PAYABLE,
        ActivityType.CUSTOMER_DEBTOR: Category.PAYABLE,
        ActivityType.EXPENSE: Category.PAYABLE,
        ActivityType.PAYROLL: Category.PAYABLE,
        ActivityType.ADVANCE: Category.PAYABLE,
        ActivityType.ACCOUNT_TRANSFER: Category.PAYABLE,
        ActivityType.STOCK_TRANSFER: Category.STOCK,
        ActivityType.SALE_RETURN: Category.RETURN,
        ActivityType.PURCHASE_RETURN: Category.RETURN,
    }

    shop = models.ForeignKey(
        Shop,
        on_delete=models.CASCADE,
        related_name="daily_diary_logs",
    )
    entry_date = models.DateField(default=timezone.localdate)
    entry_datetime = models.DateTimeField(default=timezone.now)
    activity_type = models.CharField(
        max_length=32,
        choices=ActivityType.choices,
        default=ActivityType.MANUAL,
    )
    category = models.CharField(
        max_length=32,
        choices=Category.choices,
        default=Category.MANUAL,
        db_index=True,
    )
    source_model = models.CharField(max_length=64, blank=True, default="")
    source_id = models.PositiveIntegerField(null=True, blank=True)
    title = models.CharField(max_length=255)
    party = models.CharField(max_length=255, blank=True, default="")
    amount = models.DecimalField(max_digits=18, decimal_places=2, null=True, blank=True)
    currency = models.ForeignKey(
        Currency,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="daily_diary_logs",
    )
    description = models.TextField(blank=True, default="")
    is_auto = models.BooleanField(default=False)
    is_deleted = models.BooleanField(default=False)

    class Meta:
        ordering = ["-entry_datetime", "-id"]
        indexes = [
            models.Index(fields=["shop", "entry_date"]),
            models.Index(fields=["activity_type"]),
            models.Index(fields=["source_model", "source_id"]),
        ]
        constraints = [
            models.UniqueConstraint(
                fields=["source_model", "source_id"],
                condition=models.Q(is_auto=True, is_deleted=False),
                name="unique_auto_diary_log_source",
            )
        ]

    def __str__(self):
        return f"{self.title} ({self.entry_date})"

