"""
This module provides the Namespace class for managing namespaces in the AtomRDF library.

The Namespace class extends the rdflib.Namespace class and provides additional functionality for working with namespaces.

Classes
-------
Namespace
    A class representing a namespace in the AtomRDF library.
"""

import os
from rdflib import Literal, URIRef
from rdflib import Namespace as RDFLibNamespace
from pyscal3.atoms import AttrSetter

from atomrdf.network.network import OntologyNetwork


class Namespace(AttrSetter, RDFLibNamespace):
    """A class representing a namespace in the AtomRDF library.

    This class extends the `rdflib.Namespace` classes.

    Parameters
    ----------
    infile : str
        The input file path.
    delimiter : str, optional
        The delimiter used in the input file. Defaults to "/".

    Attributes
    ----------
    network : OntologyNetwork
        The ontology network associated with the namespace.
    name : str
        The name of the namespace.
    """

    def __init__(self, infile, delimiter="/"):
        """
        Initialize the Namespace class.

        Parameters
        ----------
        infile : str
            The input file path.
        delimiter : str, optional
            The delimiter used in the input file. Defaults to "/".
        """
        AttrSetter.__init__(self)
        self.network = OntologyNetwork(infile, delimiter=delimiter)
        RDFLibNamespace.__init__(self.network.onto.tree.base_iri)
        self.name = self.network.onto.tree.name
        mapdict = {}

        # now iterate over all attributes
        for k1 in ["class", "object_property", "data_property"]:
            for k2, val in self.network.onto.attributes[k1].items():
                if val.namespace == self.name:
                    mapdict[val.name_without_prefix] = val

        # add attributes
        self._add_attribute(mapdict)


file_location = os.path.dirname(__file__)

CMSO = Namespace(os.path.join(file_location, "data/cmso.owl"))
PLDO = Namespace(os.path.join(file_location, "data/pldo.owl"))
PODO = Namespace(os.path.join(file_location, "data/podo.owl"))
ASMO = Namespace(os.path.join(file_location, "data/asmo.owl"))
PROV = RDFLibNamespace("http://www.w3.org/ns/prov#")
MDO = RDFLibNamespace("https://w3id.org/mdo/calculation/")

MATH = RDFLibNamespace("http://purls.helmholtz-metadaten.de/asmo/")
UNSAFECMSO = RDFLibNamespace("http://purls.helmholtz-metadaten.de/cmso/")
UNSAFEASMO = RDFLibNamespace("http://purls.helmholtz-metadaten.de/asmo/")
