#!/usr/bin/env python3

from typing import List, Tuple, Union

from .pb_type import Port

SinglePinPortPinName = str  # "PortName" -- Will not have square brackets
MultiPinPortPinName = str  # "PortName[PinIndex]"


def flatten(ports: List[Port]
            ) -> Tuple[Union[SinglePinPortPinName, MultiPinPortPinName],
                       SinglePinPortPinName]:
    """Mapping from pins a list of ports to individual width ports pins.

    Parameters
    ----------
    ports
        List of ports to flatten, accepts both single pin ports as strings or
        multi-pin ports as a tuple of port name and port width.

    Yields
    -------
    (str, str)
        Mapping between original port pin names to single pin port names.

    >>> print(list(flatten(['A', ('B', 1), ('C', 2)])))
    [('A', 'A'), ('B', 'B'), ('C[0]', 'C0'), ('C[1]', 'C1')]
    """
    for x in ports:
        if isinstance(x, tuple):
            n, bits = x
        else:
            n = x
            bits = 1

        if bits == 1:
            yield (n, n)
        else:
            for i in range(0, bits):
                src = "{}[{}]".format(n, i)
                dst = "{}{}".format(n, i)
                yield (src, dst)
