#export COINMARKETCAP_APIKEY='aaaa'

"""
ENDPOINTS
Cryptocurrency	/v1/cryptocurrency/info	Get cryptocurrency metadata	https://pro-api.coinmarketcap.com/v1/cryptocurrency/info?id=1,2,10
Cryptocurrency	/v1/cryptocurrency/map	Get cryptocurrency CoinMarketCap ID map	https://pro-api.coinmarketcap.com/v1/cryptocurrency/map?listing_status=active&start=1&limit=100
Cryptocurrency	/v1/cryptocurrency/listings/latest	List all cryptocurrencies (latest)	https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?sort=market_cap&start=1&limit=10&cryptocurrency_type=tokens&convert=USD,BTC
Cryptocurrency	/v1/cryptocurrency/listings/historical	List all cryptocurrencies (historical)	https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/historical?date=2018-10-10&sort=market_cap&start=1&limit=10&cryptocurrency_type=tokens&convert=USD,BTC

Cryptocurrency	/v1/cryptocurrency/market-pairs/latest	Get cryptocurrency market pairs (latest)	https://pro-api.coinmarketcap.com/v1/cryptocurrency/market-pairs/latest?id=1&convert=LTC,ETH
Cryptocurrency	/v1/cryptocurrency/ohlcv/historical	Get cryptocurrency OHLCV values (historical)	https://pro-api.coinmarketcap.com/v1/cryptocurrency/ohlcv/historical?time_start=2017-01-01&id=1&time_start=2017-01-01&time_end=2018-01-
Cryptocurrency	/v1/cryptocurrency/ohlcv/latest	Get cryptocurrency OHLCV values (latest)	https://pro-api.coinmarketcap.com/v1/cryptocurrency/ohlcv/latest?convert=CAD
Cryptocurrency	/v1/cryptocurrency/quotes/latest	Get cryptocurrency market quotes (latest)	https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=BTC,ETH,XRP,BCH,EOS,LTC,XLM&convert=BTC,ETH,EUR
Cryptocurrency	/v1/cryptocurrency/quotes/historical	Get cryptocurrency market quotes (historical)	https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/historical?id=1&time_start=2017&time_end=2018&interval=30d&count=12

Exchange	/v1/exchange/info	Get exchange metadata	https://pro-api.coinmarketcap.com/v1/exchange/info?id=1,2,10
Exchange	/v1/exchange/map	Get exchange to CoinMarketCap ID map	https://pro-api.coinmarketcap.com/v1/exchange/map?listing_status=active&start=1&limit=100
Exchange	/v1/exchange/listings/latest	List all exchanges (latest)	https://pro-api.coinmarketcap.com/v1/exchange/listings/latest?limit=10&market_type=no_fees&convert=USD
Exchange	/v1/exchange/market-pairs/latest	Get exchange market pairs (latest)	https://pro-api.coinmarketcap.com/v1/exchange/market-pairs/latest?slug=gdax&convert=LTC,XRP,EUR
Exchange	/v1/exchange/quotes/latest	Get exchange market quotes (latest)	https://pro-api.coinmarketcap.com/v1/exchange/quotes/latest?id=2,16&convert=USD,BTC,LTC,EUR
Exchange	/v1/exchange/quotes/historical	Get exchange market quotes (historical)	https://pro-api.coinmarketcap.com/v1/exchange/quotes/historical?id=270&time_start=2018-01-01&time_end=2018-05-01&interval=30d&count=12
Global Metrics	/v1/global-metrics/quotes/latest	Get aggregate market metrics (latest)	https://pro-api.coinmarketcap.com/v1/global-metrics/quotes/latest?convert=BTC,ETH,LTC,EUR
Global Metrics	/v1/global-metrics/quotes/historical	Get aggregate market metrics (historical)	https://pro-api.coinmarketcap.com/v1/global-metrics/quotes/historical?interval=monthly&count=100
Tools	/v1/tools/price-conversion	Price conversion tool	https://pro-api.coinmarketcap.com/v1/tools/price-conversion?symbol=BTC&amount=50&convert=USD,GBP,LTC



map
{
"id": 1,
"name": "Bitcoin",
"symbol": "BTC",
"slug": "bitcoin",
"is_active": 1,
"first_historical_data": "2013-04-28T18:47:21.000Z",
"last_historical_data": "2019-04-05T20:44:01.000Z",
"platform": null
},

metadata
"1": {
"urls": {
"website": [
"https://bitcoin.org/"
],
"twitter": [ ],
"reddit": [
"https://reddit.com/r/bitcoin"
],
"message_board": [
"https://bitcointalk.org"
],
"announcement": [ ],
"chat": [ ],
"explorer": [
"https://blockchain.info/",
"https://live.blockcypher.com/btc/",
"https://blockchair.com/bitcoin"
],
"source_code": [
"https://github.com/bitcoin/"
]
},
"logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/1.png",
"id": 1,
"name": "Bitcoin",
"symbol": "BTC",
"slug": "bitcoin",
"description": "Bitcoin (BTC) is a consensus network that enables a new payment system and a completely digital currency. Powered by its users, it is a peer to peer payment network that requires no central authority to operate. On October 31st, 2008, an individual or group of individuals operating under the pseudonym "Satoshi Nakamoto" published the Bitcoin Whitepaper and described it as: "a purely peer-to-peer version of electronic cash would allow online payments to be sent directly from one party to another without going through a financial institution."",
"date_added": "2013-04-28T00:00:00.000Z",
"tags": [
"mineable"
],
"platform": null,
"category": "coin"
"""

from requests import Request, Session
from requests.exceptions import ConnectionError, Timeout, TooManyRedirects
import json
import time
import os

base_url = 'https://pro-api.coinmarketcap.com/v1/'
cmc_key = os.environ["COINMARKETCAP_APIKEY"]

def get_listings(start=1,limit=1000):
    parameters = {
        'start': start,
        'limit': str(limit),
        'convert': 'USD',
        'sort': 'market_cap'
    }
    #sort=market_cap&start=1&limit=10&cryptocurrency_type=tokens&convert=USD,BTC
    headers = {
        'Accepts': 'application/json',
        'X-CMC_PRO_API_KEY': cmc_key,
    }

    session = Session()
    session.headers.update(headers)

    endpoint_summary = 'cryptocurrency/listings/latest'
    try:
        url = base_url + endpoint_summary
        response = session.get(url, params=parameters)
        data = json.loads(response.text)["data"]
        return data
    except (ConnectionError, Timeout, TooManyRedirects) as e:
        print(e)

def get_listings_all():
    allcoins = list()
    for i in range(1,10000,1000):
        print ("get ",i)
        coins = get_listings(start=i)
        allcoins += coins
    return allcoins


def get_info(idlist):
    endpoint_description = "cryptocurrency/info"
    
    #[str(x)+',' for x in range(1,20)]
    parameters = {
        #'symbol': 'BTC,ETH,XRP,LTC'
        'id':idlist
    }
    headers = {
        'Accepts': 'application/json',
        'X-CMC_PRO_API_KEY': cmc_key,
    }

    session = Session()
    session.headers.update(headers)

    try:
        url = base_url + endpoint_description
        response = session.get(url, params=parameters)
        data = json.loads(response.text)["data"]
        return data
    except (ConnectionError, Timeout, TooManyRedirects) as e:
        print("error ", e)    

def get_info_all(maxr=10000):
    print ("get_description_all")
    allcoins = list()
    #maxr = 10000
    for x in range(1,maxr,100):
        #print (x)
        try:
            idlist = ','.join([str(z) for z in range(x,x+100)])
            print ("get ",x,idlist)
            coins = list(get_info(idlist).values())
            #print (coins)
            print ("result ",len(coins))
            #print (coins[0])
            allcoins += coins
            
            time.sleep(1)
        except:
            pass
    return allcoins

def get_coin_map(active):
    endpoint_map = "cryptocurrency/map"    
    parameters = {
        'listing_status': active
    }
    headers = {
        'Accepts': 'application/json',
        'X-CMC_PRO_API_KEY': cmc_key,
    }

    session = Session()
    session.headers.update(headers)

    try:
        url = base_url + endpoint_map
        response = session.get(url, params=parameters)
        data = json.loads(response.text)["data"]
        return data
    except (ConnectionError, Timeout, TooManyRedirects) as e:
        print(e)

def exchange_map():    
    endpoint_map = "exchange/map"
    parameters = {
        #'listing_status': active
    }
    #limit
    #slug
    headers = {
        'Accepts': 'application/json',
        'X-CMC_PRO_API_KEY': cmc_key,
    }

    session = Session()
    session.headers.update(headers)

    try:
        url = base_url + endpoint_map
        response = session.get(url, params=parameters)
        data = json.loads(response.text)
        return data
    except (ConnectionError, Timeout, TooManyRedirects) as e:
        print(e)