# ==============================================================================
# Binaries and/or source for the following packages or projects
# are presented under one or more of the following open source licenses:
# collection.py    The OpenLane-V2 Dataset Authors    Apache License, Version 2.0
#
# Contact wanghuijie@pjlab.org.cn if you have any issue.
#
# Copyright (c) 2023 The OpenLane-v2 Dataset Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================

from ..io import io
from .frame import Frame


class Collection:
    r"""
    A collection of frames.

    """

    def __init__(self, data_root: str, meta_root: str, collection: str) -> None:
        r"""
        Parameters
        ----------
        data_root : str
        meta_root : str
        collection : str
            Name of collection.

        """
        try:
            meta = io.pickle_load(f'{meta_root}/{collection}.pkl')
        except FileNotFoundError:
            raise FileNotFoundError('Please run the preprocessing first to generate pickle file of the collection.')

        self.frames = {k: Frame(data_root, v) for k, v in meta.items()}
        self.keys = list(self.frames.keys())

    def get_frame_via_identifier(self, identifier: tuple) -> Frame:
        r"""
        Returns a frame with the given identifier (split, segment_id, timestamp).

        Parameters
        ----------
        identifier : tuple
            (split, segment_id, timestamp).

        Returns
        -------
        Frame
            A frame identified by the identifier.

        """
        return self.frames[identifier]

    def get_frame_via_index(self, index: int) -> (tuple, Frame):
        r"""
        Returns a frame with the given index.

        Parameters
        ----------
        index : int

        Returns
        -------
        (tuple, Frame)
            The identifier of the frame and the frame.

        """
        return self.keys[index], self.frames[self.keys[index]]
