import sys
import traceback

from catalyst.errors import ZiplineError


def silent_except_hook(exctype, excvalue, exctraceback):
    if exctype in [MarketplacePubAddressEmpty, MarketplaceDatasetNotFound,
                   MarketplaceNoAddressMatch, MarketplaceHTTPRequest,
                   MarketplaceNoCSVFiles, MarketplaceContractDataNoMatch,
                   MarketplaceSubscriptionExpired, MarketplaceJSONError,
                   MarketplaceWalletNotSupported, MarketplaceEmptySignature,
                   MarketplaceRequiresPython3]:
        fn = traceback.extract_tb(exctraceback)[-1][0]
        ln = traceback.extract_tb(exctraceback)[-1][1]
        print("Error traceback: {1} (line {2})\n"
              "{0.__name__}:  {3}".format(exctype, fn, ln, excvalue))
    else:
        sys.__excepthook__(exctype, excvalue, exctraceback)


sys.excepthook = silent_except_hook


class MarketplacePubAddressEmpty(ZiplineError):
    msg = (
        'Please enter your public address to use in the Data Marketplace '
        'in the following file: {filename}'
    ).strip()


class MarketplaceDatasetNotFound(ZiplineError):
    msg = (
        'The dataset "{dataset}" is not registered in the Data Marketplace.'
    ).strip()


class MarketplaceNoAddressMatch(ZiplineError):
    msg = (
        'The address registered with the dataset {dataset}: {address} '
        'does not match any of your addresses.'
    ).strip()


class MarketplaceHTTPRequest(ZiplineError):
    msg = (
        'Request to remote server to {request} failed: {error}'
    ).strip()


class MarketplaceNoCSVFiles(ZiplineError):
    msg = (
        'No CSV files found on {datadir} to upload.'
    )


class MarketplaceContractDataNoMatch(ZiplineError):
    msg = (
        'The information found on the contract does not match the '
        'requested data:\n{params}.'
    )


class MarketplaceSubscriptionExpired(ZiplineError):
    msg = (
        'Your subscription to dataset "{dataset}" expired on {date} '
        'and is no longer active. You have to subscribe again running the '
        'following command:\n'
        'catalyst marketplace subscribe --dataset={dataset}'
    )


class MarketplaceWalletNotSupported(ZiplineError):
    msg = (
        'Wallet {wallet} is not supported.'
    )


class MarketplaceEmptySignature(ZiplineError):
    msg = (
        'Signature cannot be empty.'
    )


class MarketplaceJSONError(ZiplineError):
    msg = (
        'The configuration file {file} is malformed. Please correct '
        'the following error:\n{error}'
    )


class MarketplaceRequiresPython3(ZiplineError):
    msg = (
        '\nCatalyst requires Python3 to access the Enigma Data Marketplace.\n'
        'If you want to use the Data Marketplace, you need to reinstall '
        'Catalyst\nwith Python3. See the documentation website for additional '
        'information.')