"""
inventory/services/expense_service.py
────────────────────────────────────────
Records and manages operational expenses.
"""

import logging
from datetime import date
from decimal import Decimal

from django.db import transaction

from inventory.models import AuditLog, Expense, ExpenseCategory

logger = logging.getLogger(__name__)


@transaction.atomic
def record_expense(
    *,
    category: ExpenseCategory,
    amount: Decimal,
    expense_date: date,
    description: str,
    linked_book=None,
    linked_event=None,
    linked_sale=None,
    receipt_image=None,
    notes: str = "",
    user=None,
) -> Expense:
    if amount <= Decimal("0"):
        raise ValueError("Expense amount must be positive.")

    expense = Expense.objects.create(
        category=category,
        amount=amount,
        date=expense_date,
        description=description,
        linked_book=linked_book,
        linked_event=linked_event,
        linked_sale=linked_sale,
        receipt_image=receipt_image,
        notes=notes,
        recorded_by=user,
    )

    AuditLog.objects.create(
        user=user,
        action=AuditLog.ACTION_CREATE,
        model_name="Expense",
        object_id=str(expense.pk),
        object_repr=str(expense),
        new_values={
            "category": category.name,
            "amount": str(amount),
            "date": str(expense_date),
        },
    )
    logger.info("Expense recorded: %s | KES %s | %s", category.name, amount, expense_date)
    return expense


def seed_default_categories() -> list[ExpenseCategory]:
    """Idempotently create the standard expense categories."""
    defaults = [
        "Transport",
        "Marketing",
        "Printing",
        "Event Costs",
        "Storage",
        "Salaries",
        "Utilities",
        "Miscellaneous",
    ]
    created = []
    for name in defaults:
        cat, _ = ExpenseCategory.objects.get_or_create(name=name)
        created.append(cat)
    return created
