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

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

class CreateDivision(graphene.Mutation):
    class Arguments:
        input = CreateDivisionInput(required=True)

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

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

        try:
            with get_dynamic_connection(db_name) as conn:
                with conn.cursor() as cur:
                    # Check if division name already exists
                    cur.execute("SELECT id FROM level WHERE description = %s LIMIT 1", (input.division_name,))
                    if cur.fetchone():
                        return CreateDivision(
                            success=False,
                            message=f"Division '{input.division_name}' already exists."
                        )

                    gender_str = str(input.gender).strip().lower()
                    gender_val = 0
                    if "girl" in gender_str or "female" in gender_str or "women" in gender_str:
                        gender_val = 2
                    elif "boy" in gender_str or "male" in gender_str or "men" in gender_str:
                        gender_val = 1

                    cur.execute(
                        """
                        INSERT INTO level (
                            description, gender, start, end, max_teams,
                            League_ID, sp_id, div_code
                        ) VALUES (%s, %s, %s, %s, %s, 1, 1, "")
                        """,
                        (
                            input.division_name,
                            gender_val,
                            input.start_age_or_grade,
                            input.end_age_or_grade,
                            input.max_teams
                        )
                    )
                    conn.commit()
                    division_id = cur.lastrowid

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

class DivisionMutation:
    create_division = CreateDivision.Field()
