# app/modules/billing/services/billing_features.py
"""
Billing feature provider for the billing feature system.

Declares billing-related billable features (invoicing, accounting export,
basic shop, custom domain, white label) for feature gating.
"""

from __future__ import annotations

import logging
from typing import TYPE_CHECKING

from app.modules.contracts.features import (
    FeatureDeclaration,
    FeatureScope,
    FeatureType,
    FeatureUsage,
)

if TYPE_CHECKING:
    from sqlalchemy.orm import Session

logger = logging.getLogger(__name__)


class BillingFeatureProvider:
    """Feature provider for the billing module.

    Declares:
    - invoice_lu: binary merchant-level feature for Luxembourg invoicing
    - invoice_eu_vat: binary merchant-level feature for EU VAT invoicing
    - invoice_bulk: binary merchant-level feature for bulk invoice generation
    - accounting_export: binary merchant-level feature for accounting data export
    - basic_shop: binary merchant-level feature for basic shop functionality
    - custom_domain: binary merchant-level feature for custom domain support
    - white_label: binary merchant-level feature for white-label branding
    """

    @property
    def feature_category(self) -> str:
        return "billing"

    def get_feature_declarations(self) -> list[FeatureDeclaration]:
        return [
            FeatureDeclaration(
                code="invoice_lu",
                name_key="billing.features.invoice_lu.name",
                description_key="billing.features.invoice_lu.description",
                category="billing",
                feature_type=FeatureType.BINARY,
                scope=FeatureScope.MERCHANT,
                ui_icon="file-text",
                display_order=10,
            ),
            FeatureDeclaration(
                code="invoice_eu_vat",
                name_key="billing.features.invoice_eu_vat.name",
                description_key="billing.features.invoice_eu_vat.description",
                category="billing",
                feature_type=FeatureType.BINARY,
                scope=FeatureScope.MERCHANT,
                ui_icon="globe",
                display_order=20,
            ),
            FeatureDeclaration(
                code="invoice_bulk",
                name_key="billing.features.invoice_bulk.name",
                description_key="billing.features.invoice_bulk.description",
                category="billing",
                feature_type=FeatureType.BINARY,
                scope=FeatureScope.MERCHANT,
                ui_icon="layers",
                display_order=30,
            ),
            FeatureDeclaration(
                code="accounting_export",
                name_key="billing.features.accounting_export.name",
                description_key="billing.features.accounting_export.description",
                category="billing",
                feature_type=FeatureType.BINARY,
                scope=FeatureScope.MERCHANT,
                ui_icon="download",
                display_order=40,
            ),
            FeatureDeclaration(
                code="basic_shop",
                name_key="billing.features.basic_shop.name",
                description_key="billing.features.basic_shop.description",
                category="billing",
                feature_type=FeatureType.BINARY,
                scope=FeatureScope.MERCHANT,
                ui_icon="shopping-bag",
                display_order=50,
            ),
            FeatureDeclaration(
                code="custom_domain",
                name_key="billing.features.custom_domain.name",
                description_key="billing.features.custom_domain.description",
                category="billing",
                feature_type=FeatureType.BINARY,
                scope=FeatureScope.MERCHANT,
                ui_icon="globe",
                display_order=60,
            ),
            FeatureDeclaration(
                code="white_label",
                name_key="billing.features.white_label.name",
                description_key="billing.features.white_label.description",
                category="billing",
                feature_type=FeatureType.BINARY,
                scope=FeatureScope.MERCHANT,
                ui_icon="award",
                display_order=70,
            ),
        ]

    def get_store_usage(
        self,
        db: Session,
        store_id: int,
    ) -> list[FeatureUsage]:
        return []

    def get_merchant_usage(
        self,
        db: Session,
        merchant_id: int,
        platform_id: int,
    ) -> list[FeatureUsage]:
        return []


# Singleton instance for module registration
billing_feature_provider = BillingFeatureProvider()

__all__ = [
    "BillingFeatureProvider",
    "billing_feature_provider",
]
