#!/usr/bin/env python3

import requests
from pycoingecko import CoinGeckoAPI
import operator
import random


def get_coin_pair_data(exclude=[], include=[]):
    cg = CoinGeckoAPI()
    coins = cg.get_coins_list()
    random.shuffle(coins)
    coin_data = []
    for coin in coins:
        try:
            market_data = cg.get_coin_by_id(coin['id'])['tickers']
            pairs_data = []
            for i in market_data:
                market = i['market']['name']
                price = float(i['converted_last']['usd'])
                volume = float(i['converted_volume']['usd'])
                info = {'market': market,
                        'price': price,
                        'target': i['target'],
                        'volume': volume
                        }
                if len(include) == 0:
                    if market not in exclude:
                        pairs_data.append(info)
                else:
                    if market in include:
                        pairs_data.append(info)
            coin_data.append({'name': i['base'], 'market data': pairs_data})
        except:
            continue
    return (coin_data)


def coins_by_spread(coins, min_volume=5000):
    coins_spread = []
    for coin in coins:
        prices = []
        for m in coin['market data']:
            vol = m['volume']
            if vol >= min_volume:
                prices.append(m['price'])
        if len(prices) > 1:
            spread = ((max(prices) - min(prices)) / min(prices)) * 100
            coins_spread.append({'name': coin['name'], 'spread': spread})
    coins_spread.sort(key=operator.itemgetter('spread'))
    return (coins_spread)


def get_coins_with_spread(min_spread=0.01):
    exchanges = ['Bibox',
                 'Huobi Global',
                 'Poloniex',
                 'Kraken',
                 'Kucoin',
                 'Bittrex',
                 'Binance',
                 'HitBTC',
                 'Upbit',
                 'Coineal'
                 ]
    coins = get_coin_pair_data(include=exhanges)
    coins = coins_by_spread(coins)
    return (coins)


def main():
    coins_spread = get_coins_with_spread()
    for coin in coins_spread:
        spread = 'spread: ' + str(coin['spread'])[:4] + '%'
        print (coin['name'], spread)


if __name__ == "__main__":
    main()