import abc

from vault_client.client.conio_user import ConioUser

from conio_sdk.generated_protobuf import v1_pb2


class CryptoProofVerificationStrategy(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def verify(self, crypto_proof: v1_pb2.SignupCryptoRequest) -> bool:
        pass  # pragma: no cover

    @abc.abstractmethod
    def verify_pay_for_bid(self, crypto_proof: v1_pb2.PayForBidCryptoRequest, user: ConioUser) -> bool:
        pass  # pragma: no cover

    @abc.abstractmethod
    def verify_pay_for_bid_using_wiretransfer(
            self, bid_id: str, crypto_proof: v1_pb2.PayForBidWTCryptoRequest, user: ConioUser) -> bool:
        pass  # pragma: no cover


class CompositeCryptoProofVerificationStrategy(CryptoProofVerificationStrategy):
    def __init__(self, *delegate: CryptoProofVerificationStrategy):
        self._delegate = delegate

    def verify(self, *a, **kw):
        return all(map(lambda d: d.verify(*a, **kw), self._delegate))

    def verify_pay_for_bid(self, *a, **kw):
        return all(map(lambda d: d.verify_pay_for_bid(*a, **kw), self._delegate))

    def verify_pay_for_bid_using_wiretransfer(self, *a, **kw) -> bool:
        return all(map(lambda d: d.verify_pay_for_bid_using_wiretransfer(*a, **kw), self._delegate))
