import graphene
import logging
from db import get_dynamic_connection
from ..types import CreateSeasonInput

logger = logging.getLogger("scheduler.season")

class CreateSeason(graphene.Mutation):
    class Arguments:
        input = CreateSeasonInput(required=True)

    success = graphene.Boolean()
    message = graphene.String()
    season_id = graphene.Int()

    def mutate(self, info, input):
        db_name = info.context.get("db_name")
        if not db_name:
            return CreateSeason(success=False, message="Organisation database not configured.")

        try:
            with get_dynamic_connection(db_name) as conn:
                with conn.cursor() as cur:
                    # Check if a season with this name and year already exists
                    cur.execute(
                        "SELECT season_id FROM season WHERE season_desc = %s AND year_id = %s LIMIT 1",
                        (input.season_name, input.season_year)
                    )
                    if cur.fetchone():
                        return CreateSeason(
                            success=False,
                            message=f"Season '{input.season_name}' for year {input.season_year} already exists."
                        )

                    # Map status to hide
                    hide_val = 0
                    if input.status and str(input.status).strip().lower() in ["inactive", "hidden", "hide"]:
                        hide_val = 1

                    cur.execute(
                        """
                        INSERT INTO season (
                            season_desc, season_start, season_end, year_id,
                            reg_start_date, reg_end_date, early_bird_1, late_fee_date,
                            season_order, season_type, hide, League_ID
                        ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, 1.00, 1, %s, 1)
                        """,
                        (
                            input.season_name,
                            input.start_date,
                            input.end_date,
                            int(input.season_year),
                            input.registration_start,
                            input.registration_end,
                            input.early_bird_date,
                            input.late_fee_date,
                            hide_val
                        )
                    )
                    conn.commit()
                    season_id = cur.lastrowid

            return CreateSeason(
                success=True,
                message=f"Season '{input.season_name}' created successfully.",
                season_id=season_id
            )
        except Exception as e:
            logger.error(f"Unexpected error during season creation: {e}", exc_info=True)
            # Keep database errors internal, do not expose SQL details to users.
            return CreateSeason(
                success=False,
                message="An unexpected database error occurred during season creation."
            )

class SeasonMutation:
    create_season = CreateSeason.Field()
