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

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

class CreateField(graphene.Mutation):
    class Arguments:
        input = CreateFieldInput(required=True)

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

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

        try:
            with get_dynamic_connection(db_name) as conn:
                with conn.cursor() as cur:
                    # Check if field name already exists
                    cur.execute("SELECT rsc_id FROM resource WHERE rsc_name = %s LIMIT 1", (input.field_name,))
                    existing = cur.fetchone()
                    if existing:
                        return CreateField(
                            success=False,
                            message=f"Field '{input.field_name}' already exists.",
                            field_id=existing["rsc_id"]
                        )

                    site_id = 0
                    if input.address and str(input.address).strip() != "":
                        addr_str = str(input.address).strip()
                        cur.execute("SELECT site_id FROM site WHERE site_name = %s LIMIT 1", (addr_str,))
                        site_row = cur.fetchone()
                        if site_row:
                            site_id = site_row["site_id"]
                        else:
                            cur.execute(
                                "INSERT INTO site (site_name, site_address1, leagueID) VALUES (%s, %s, 1)",
                                (addr_str, addr_str)
                            )
                            site_id = cur.lastrowid

                    cur.execute(
                        """
                        INSERT INTO resource (
                            rsc_name, site_id, active, rsc_capacity, rsct_id, prim_tsg_id
                        ) VALUES (%s, %s, 1, 1, 0, 0)
                        """,
                        (input.field_name, site_id)
                    )
                    conn.commit()
                    field_id = cur.lastrowid

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

class FieldMutation:
    create_field = CreateField.Field()
