"""
Calendar service for fetching available accounting periods
"""
# import sys  # Removed - no longer needed
import os

from shared.database.oracle_pool import oracle_pool
from ..models.calendar import CalendarPeriod, CalendarPeriodsResponse
from ..cache.decorators import cached
import logging

logger = logging.getLogger(__name__)


class CalendarService:
    """Service for calendar/accounting period operations"""

    # Romanian month names for display
    MONTH_NAMES_RO = [
        "Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie",
        "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie"
    ]

    @staticmethod
    @cached(cache_type='schema', key_params=['company_id'])
    async def _get_schema(company_id: int) -> str:
        """Get schema for company (CACHED 24h)"""
        async with oracle_pool.get_connection() as connection:
            with connection.cursor() as cursor:
                cursor.execute("""
                    SELECT schema FROM CONTAFIN_ORACLE.v_nom_firme
                    WHERE id_firma = :company_id
                """, {'company_id': company_id})
                result = cursor.fetchone()
                return result[0] if result else None

    @staticmethod
    @cached(cache_type='calendar_periods', key_params=['company_id'])
    async def get_available_periods(company_id: int) -> CalendarPeriodsResponse:
        """
        Get all available accounting periods for a company (CACHED 1h)

        Returns periods ordered by year DESC, month DESC with Romanian month names.
        """
        schema = await CalendarService._get_schema(company_id)
        if not schema:
            logger.warning(f"Schema not found for company {company_id}")
            return CalendarPeriodsResponse(periods=[], current_period=None, total_count=0)

        async with oracle_pool.get_connection() as connection:
            with connection.cursor() as cursor:
                cursor.execute(f"""
                    SELECT anul, luna
                    FROM {schema}.calendar
                    ORDER BY anul DESC, luna DESC
                """)
                rows = cursor.fetchall()

                periods = []
                for row in rows:
                    an, luna = row[0], row[1]
                    month_name = CalendarService.MONTH_NAMES_RO[luna - 1]
                    periods.append(CalendarPeriod(
                        an=an,
                        luna=luna,
                        display_name=f"{month_name} {an}"
                    ))

                current_period = periods[0] if periods else None

                logger.info(f"Loaded {len(periods)} accounting periods for company {company_id}")

                return CalendarPeriodsResponse(
                    periods=periods,
                    current_period=current_period,
                    total_count=len(periods)
                )
