import logging
import os
from lxml import etree

logger = logging.getLogger(__name__)

XSD_PATH = os.path.join(os.path.dirname(__file__), "../../schemas/camt.053.001.02.xsd")


class XSDValidator:
    def __init__(self):
        self._schema = None
        xsd_path = os.path.abspath(XSD_PATH)
        if os.path.exists(xsd_path):
            try:
                with open(xsd_path, "rb") as f:
                    xmlschema_doc = etree.parse(f)
                self._schema = etree.XMLSchema(xmlschema_doc)
            except Exception as e:
                logger.warning(f"No se pudo cargar XSD: {e}")
        else:
            logger.warning(f"XSD no encontrado en {xsd_path}, validación omitida")

    def validate(self, xml_string: str) -> tuple[bool, list[str]]:
        if self._schema is None:
            return (True, [])

        try:
            doc = etree.fromstring(xml_string.encode("utf-8"))
            is_valid = self._schema.validate(doc)
            errors = [str(e) for e in self._schema.error_log]
            return (is_valid, errors)
        except etree.XMLSyntaxError as e:
            return (False, [str(e)])
