#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys, argparse
from six import string_types

from haveibeenpwned import pwned, pwned_full
from haveibeenpwned import __version__, __summary__


record_types = (
    'Title',
    'Name',
    'Domain',
    'BreachDate',
    'AddedDate',
    'ModifiedDate',
    'PwnCount',
    'Description'
)


class Style:
    BOLD = '\033[1m'
    OK = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    LINK = '\033[94m'
    END = '\033[0m'


def _no_problems_msg():
    print('{}{}No problems here! :-){}'.format(Style.BOLD, Style.OK, Style.END))


def _copyright():
    print('More detailed data on: {}https://haveibeenpwned.com/{}'.format(Style.LINK, Style.END))


def _display_status(email):
    if pwned(email):
        print('{}{}This email address has been PWNED! :-({}'.format(Style.BOLD, Style.FAIL, Style.END))
    else:
        _no_problems_msg()


def _fix_encoding_errors(val):
    if isinstance(val, string_types):
        try:
            val.encode('ascii')
            return val
        except UnicodeEncodeError:
            return ''.join([i for i in val if ord(i) < 128])
    return val


def _display_status_with_data(email):
    response = pwned_full(email)
    if not response.get('status'):
        _no_problems_msg()
    else:
        for record in response.get('data'):
            for rtype in record_types:
                print('{}{}: {}{}'.format(Style.WARNING, rtype, Style.END, _fix_encoding_errors(record.get(rtype))))
            print('')


def main():
    parser = argparse.ArgumentParser(description=__summary__)
    parser.add_argument('email', metavar='email', help='Email address to check against')
    parser.add_argument('-f', '--full', action='store_true', help='response will full data not just boolean, if any exists')
    parser.add_argument('-v', '--version', action='version', version=__version__)
    args = parser.parse_args()

    email = args.email
    if args.full:
        _display_status_with_data(email)
    else:
        _display_status(email)
    _copyright()


if __name__ == '__main__':
    main()
