# app/core/CRUD.py

from datetime import timezone
import pytz
from typing import Any
import hashlib

from app.core.logger_config import setup_logger
from app.exceptions import DomainError

logger = setup_logger()

class Utilities:

    def timezone_convert(self, fecha_utc, formato="%Y-%m-%d %H:%M:%S %Z%z", zona_horaria="America/Mexico_City"):
        """
        Convierte una fecha UTC a una zona horaria específica y la formatea.

        Args:
            fecha_utc: Un objeto datetime.datetime que representa la fecha y hora en UTC.
            zona_horaria: Un string que representa la zona horaria deseada (ej: "America/Mexico_City").
            formato: Un string que especifica el formato de la fecha resultante.
                    Por defecto es "%Y-%m-%d %H:%M:%S %Z%z".

        Returns:
            Un string que representa la fecha y hora convertida y formateada.
            Retorna None si la zona horaria no es válida.
        """
        try:
            # Asegurarse de que la fecha esté en UTC
            if fecha_utc.tzinfo is not timezone.utc:
                raise ValueError("La fecha debe estar en UTC")

            zona_horaria_obj = pytz.timezone(zona_horaria)
            fecha_local = fecha_utc.astimezone(zona_horaria_obj)
            return fecha_local.strftime(formato)
        except pytz.UnknownTimeZoneError as e:
            logger.error(f"Error: Zona horaria '{zona_horaria}' no válida. {e}")
            return None
        except ValueError as e:
            logger.error(f"Error: {e}")
            return None

    def ok(message: str = "OK", data: Any = None) -> dict:
        return {
            "success": True,
            "message": message,
            "data": data
        }

    def generate_short_hash(email: str) -> str:
        if ' ' in email or '@' not in email:
            raise DomainError("El correo electrónico debe contener un símbolo '@' y no debe tener espacios.")
        md5 = hashlib.md5()
        md5.update(email.encode('utf-8'))
        return md5.hexdigest()[:16]
