import os
import json
from datetime import datetime
import pytz
from flask import current_app
from utils.file_utils import load_json_file, save_json_file


def get_schema_file_path():
    """Get path to the schema storage file."""
    storage_path = current_app.config["STORAGE_PATH"]
    return os.path.join(storage_path, "schemas", "schema.json")


def load_schemas():
    """Load all schemas from storage."""
    file_path = get_schema_file_path()
    if os.path.exists(file_path):
        with open(file_path, "r", encoding="utf-8") as f:
            return json.load(f)
    return {}


def save_schemas(schemas):
    """Save schemas to storage."""
    file_path = get_schema_file_path()
    with open(file_path, "w", encoding="utf-8") as f:
        json.dump(schemas, f, ensure_ascii=False, indent=2)
    return True


def get_all_schemas():
    """Get all schemas as a list."""
    schemas_dict = load_schemas()
    return [
        {**schema_data, "id": schema_id}
        for schema_id, schema_data in schemas_dict.items()
    ]


def get_schema_by_id(schema_id):
    """Get a specific schema by ID."""
    schemas = load_schemas()
    if schema_id in schemas:
        return {**schemas[schema_id], "id": schema_id}
    return None


def create_schema(schema_data, user_id):
    """
    Crear un nuevo esquema.

    Args:
        schema_data (dict): Datos del esquema
        user_id (str): ID del usuario que crea el esquema

    Returns:
        tuple: (éxito, mensaje)
    """
    schemas = load_schemas()

    # Verificar si ya existe un esquema con ese código
    schema_id = schema_data["codigo"]
    if schema_id in schemas:
        return False, f"Ya existe un esquema con el código {schema_id}."

    # Añadir metadatos
    schema_data["fecha_creacion"] = datetime.now(pytz.UTC).isoformat()
    schema_data["creado_por"] = user_id

    # Guardar esquema
    schemas[schema_id] = schema_data
    save_schemas(schemas)

    return True, f"Esquema '{schema_data['descripcion']}' creado correctamente."


def update_schema(schema_id, schema_data):
    """Update an existing schema."""
    schemas = load_schemas()
    if schema_id not in schemas:
        return False

    # Update modification timestamp
    schema_data["updated_at"] = datetime.now().isoformat()

    # Remove id from data before saving (it's used as the key)
    data_to_save = {k: v for k, v in schema_data.items() if k != "id"}

    schemas[schema_id] = data_to_save
    return save_schemas(schemas)


def delete_schema(schema_id):
    """
    Eliminar un esquema.

    Args:
        schema_id (str): ID del esquema a eliminar

    Returns:
        tuple: (éxito, mensaje)
    """
    schemas = load_schemas()

    # Verificar si existe el esquema
    if schema_id not in schemas:
        return False, f"No existe un esquema con el código {schema_id}."

    # Verificar si el esquema está en uso
    # [Implementar verificación si el esquema está asociado a proyectos]

    # Eliminar esquema
    schema_desc = schemas[schema_id].get("descripcion", schema_id)
    del schemas[schema_id]
    save_schemas(schemas)

    return True, f"Esquema '{schema_desc}' eliminado correctamente."


def initialize_default_schemas():
    """Initialize default schemas if none exist."""
    schemas = load_schemas()
    if not schemas:
        default_schemas = {
            "default": {
                "name": "Documento Estándar",
                "description": "Esquema básico para documentos",
                "fields": [
                    {"name": "title", "type": "text", "required": True},
                    {"name": "content", "type": "textarea", "required": True},
                    {"name": "tags", "type": "tags", "required": False},
                ],
                "created_by": "system",
                "created_at": datetime.now().isoformat(),
            },
            "report": {
                "name": "Informe",
                "description": "Esquema para informes formales",
                "fields": [
                    {"name": "title", "type": "text", "required": True},
                    {"name": "summary", "type": "textarea", "required": True},
                    {"name": "body", "type": "richtext", "required": True},
                    {"name": "date", "type": "date", "required": True},
                    {"name": "author", "type": "text", "required": True},
                ],
                "created_by": "system",
                "created_at": datetime.now().isoformat(),
            },
        }
        save_schemas(default_schemas)


def get_schema_document_types(schema_id):
    """
    Obtener los tipos de documentos definidos en un esquema.

    Args:
        schema_id (str): ID del esquema

    Returns:
        list: Lista de tipos de documentos en el esquema, o lista vacía si no existe
    """
    schema = get_schema_by_id(schema_id)

    if not schema or "documentos" not in schema:
        return []

    return schema["documentos"]
