from collections import namedtuple
import importlib
from lib.test.evaluation.data import SequenceList

DatasetInfo = namedtuple('DatasetInfo', ['module', 'class_name', 'kwargs'])

pt = "lib.test.evaluation.%sdataset"  # Useful abbreviations to reduce the clutter

dataset_dict = dict(
    ###### multi-modality
    gtot=DatasetInfo(module=pt % "gtot", class_name="GTOTDataset", kwargs=dict()),
   
    rgbt210=DatasetInfo(module=pt % "rgbt210", class_name="RGBT210Dataset", kwargs=dict()),
    rgbt234=DatasetInfo(module=pt % "rgbt234", class_name="RGBT234Dataset", kwargs=dict()),
    rgbt234_miss=DatasetInfo(module=pt % "rgbt234", class_name="RGBT234Dataset", kwargs=dict()),

    lashertestingset=DatasetInfo(module=pt % "lashertestingset", class_name="LasHeRtestingSetDataset", kwargs=dict()),
    lashertestingset_miss=DatasetInfo(module=pt % "lashertestingset", class_name="LasHeRtestingSetDataset", kwargs=dict()),
    
    # lashertestingset=DatasetInfo(module=pt % "lashertestingset", class_name="LasHeRtestingSetDataset", kwargs=dict()),
    # lashertestingset_lmdb=DatasetInfo(module=pt % "lashertestinglmdb", class_name="LasHeRTestLmdbDataset", kwargs=dict()),
    vtuav_miss=DatasetInfo(module=pt % "vtuav", class_name="VTUAVDataset", kwargs=dict()),

    vtuav=DatasetInfo(module=pt % "vtuav", class_name="VTUAVDataset", kwargs=dict()),

    # otb=DatasetInfo(module=pt % "otb", class_name="OTBDataset", kwargs=dict()),
    # nfs=DatasetInfo(module=pt % "nfs", class_name="NFSDataset", kwargs=dict()),
    # uav=DatasetInfo(module=pt % "uav", class_name="UAVDataset", kwargs=dict()),
    # tc128=DatasetInfo(module=pt % "tc128", class_name="TC128Dataset", kwargs=dict()),
    # tc128ce=DatasetInfo(module=pt % "tc128ce", class_name="TC128CEDataset", kwargs=dict()),
    # trackingnet=DatasetInfo(module=pt % "trackingnet", class_name="TrackingNetDataset", kwargs=dict()),
    # got10k_test=DatasetInfo(module=pt % "got10k", class_name="GOT10KDataset", kwargs=dict(split='test')),
    # got10k_val=DatasetInfo(module=pt % "got10k", class_name="GOT10KDataset", kwargs=dict(split='val')),
    # got10k_ltrval=DatasetInfo(module=pt % "got10k", class_name="GOT10KDataset", kwargs=dict(split='ltrval')),
    # lasot=DatasetInfo(module=pt % "lasot", class_name="LaSOTDataset", kwargs=dict()),
    # lasot_lmdb=DatasetInfo(module=pt % "lasot_lmdb", class_name="LaSOTlmdbDataset", kwargs=dict()),

    # vot18=DatasetInfo(module=pt % "vot", class_name="VOTDataset", kwargs=dict()),
    # vot22=DatasetInfo(module=pt % "vot", class_name="VOTDataset", kwargs=dict(year=22)),
    # itb=DatasetInfo(module=pt % "itb", class_name="ITBDataset", kwargs=dict()),
    # tnl2k=DatasetInfo(module=pt % "tnl2k", class_name="TNL2kDataset", kwargs=dict()),
    # lasot_extension_subset=DatasetInfo(module=pt % "lasotextensionsubset", class_name="LaSOTExtensionSubsetDataset",
    #                                    kwargs=dict()),
)


def load_dataset(name: str):
    """ Import and load a single dataset."""
    name = name.lower()
    dset_info = dataset_dict.get(name)
    if dset_info is None:
        raise ValueError('Unknown dataset \'%s\'' % name)

    m = importlib.import_module(dset_info.module)
    dataset = getattr(m, dset_info.class_name)(**dset_info.kwargs)  # Call the constructor
    return dataset.get_sequence_list()


def get_dataset(*args):
    """ Get a single or set of datasets."""
    dset = SequenceList()
    for name in args:
        dset.extend(load_dataset(name))
    return dset