from typing import TypedDict, Union
from dataclasses import dataclass
import pathlib


import dacite
import yaml
from dacite import from_dict
from IPython import embed

from pyrelacs.util.logging import config_logging

log = config_logging()


@dataclass
class ValueUnit:
    value: int
    unit: str


@dataclass
class Settings:
    daq: bool
    repros: list[str]
    path: str


@dataclass
class Metadata:
    SetupName: str
    Maintainer: str
    Creator: str
    SetupLocation: str
    Lab: str
    Institute: str
    University: str
    Address: str


@dataclass
class Input:
    inputsamplerate: int
    inputsamplerateunit: str
    # BufferSize
    inputtracecapacity: int
    inputtracecapacityunit: str
    inputunipolar: bool
    inputtraceid: list[str]
    inputtracescale: list[int]
    inputtraceunit: list[str]
    inputtracedevice: list[str]
    inputtracechannel: list[int]
    inputtracereference: list[str]
    inputtracemaxvalue: list[int]
    inputtracecenter: list[bool]


@dataclass
class Output:
    outputtraceid: list[str]
    outputtracedevice: list[str]
    outputtracechannel: list[int]
    outputtracescale: list[int]
    outputtraceunit: list[str]
    outputtracemaxrate: list[int]
    outputtracemaxrateunit: list[str]
    outputtracemodality: list[str]


@dataclass
class Data:
    input: Input
    output: Output


@dataclass
class Sinus:
    inputsamplerate: int
    inputsamplerateunit: str
    # BufferSize
    inputtracecapacity: int
    inputtracecapacityunit: str
    outputtraceid: list[str]
    outputtracedevice: list[str]
    outputtracechannel: list[int]
    outputtracescale: list[int]
    outputtraceunit: list[str]
    outputtracemaxrate: list[int]
    outputtracemaxrateunit: list[str]
    outputtracemodality: list[str]


@dataclass
class PyRelacs:
    data: Data
    sinus: Sinus


@dataclass
class Config:
    settings: Settings
    metadata: Metadata
    pyrelacs: PyRelacs


def load_config():
    pyrelacs_config_path = pathlib.Path(__file__).parent.parent / "config.yaml"
    log.debug(pyrelacs_config_path)
    if not pyrelacs_config_path.is_file():
        log.error("Config File was not found")
    with open(pyrelacs_config_path, "r") as config_file:
        try:
            data = yaml.full_load(config_file)
            try:
                config = from_dict(data_class=Config, data=data)
                return config
            except dacite.DaciteError as e:
                log.error(f"Invalid Config, {e}")
        except yaml.YAMLError as e:
            raise yaml.YAMLError(f"Error parsing YAML file: {e}")


if __name__ == "__main__":
    pyrelacs_config_path = pathlib.Path(__file__).parent.parent / "config.yaml"
    log.debug(pyrelacs_config_path)
    if not pyrelacs_config_path.is_file():
        log.error("Config File was not found")
    with open(pyrelacs_config_path, "r") as config_file:
        data = yaml.full_load(config_file)
        embed()
        exit()