import abc
import logging
from typing import Union
from pySim.apdu import Apdu, Tpdu, CardReset, TpduFilter

PacketType = Union[Apdu, Tpdu, CardReset]

logger = logging.getLogger(__name__)

class ApduSource(abc.ABC):
    def __init__(self):
        self.apdu_filter = TpduFilter(None)

    @abc.abstractmethod
    def read_packet(self) -> PacketType:
        """Read one packet from the source."""
        pass

    def read(self) -> Union[Apdu, CardReset]:
        """Main function to call by the user: Blocking read, returns Apdu or CardReset."""
        apdu = None
        # loop until we actually have an APDU to return
        while not apdu:
            r = self.read_packet()
            if not r:
                continue
            if isinstance(r, Tpdu):
                apdu = self.apdu_filter.input_tpdu(r)
            elif isinstance(r, Apdu):
                apdu = r
            elif isinstance(r, CardReset):
                apdu = r
            else:
                ValueError('Unknown read_packet() return %s' % r)
        return apdu
