"""dsc_datatool.transformer.labler

See `man dsc-datatool-transformer labler`.

Part of dsc_datatool.

:copyright: 2024 OARC, Inc.
"""

import yaml

from dsc_datatool import Transformer, encoding


def _process(label, d):
    l = label.get(d.name, None)
    if d.values:
        if l is None:
            return

        values = d.values
        d.values = {}

        for k, v in values.items():
            nk = l.get(k, None)
            d.values[nk or k] = v

        return

    if l:
        v = l.get(d.value, None)
        if v:
            d.value = v
    for d2 in d.dimensions:
        _process(label, d2)


class Labler(Transformer):
    label = None


    def __init__(self, opts):
        Transformer.__init__(self, opts)
        if not 'yaml' in opts:
            raise Exception('yaml=file option required')
        f = open(opts.get('yaml'), 'r', encoding=encoding)
        try:
            self.label = yaml.full_load(f)
        except AttributeError:
            self.label = yaml.load(f)
        f.close()


    def process(self, datasets):
        if self.label is None:
            return

        for dataset in datasets:
            label = self.label.get(dataset.name, None)
            if label is None:
                continue

            for d in dataset.dimensions:
                _process(label, d)


import sys
if sys.version_info[0] == 3 and sys.version_info[1] == 5: # pragma: no cover
    Transformer.__init_subclass__(Labler)