#!/usr/bin/env python

import argparse
import os
import re
from e4client import E4Connect

if __name__ == "__main__":
    DEFAULT_CSV_SESSIONS = 'sessions.csv'
    DEFAULT_CSV_DEVICES = 'devices.csv'
    DEFAULT_OUT_PATH = '.'
    DELIM = ','

    parser = argparse.ArgumentParser(description='Empatica Client')

    parser.add_argument('-u', '--user', action='store', help='Username.')
    parser.add_argument('-p', '--pwd', action='store', help='Password.')

    parser.add_argument('-a', '--all_sessions', action='store_true', help='Downloads all sessions of a user.')
    parser.add_argument('-f', '--users_file', action='store', help='Read users from file')
    parser.add_argument('-i', '--session_id', action='store', help='Downloads a specific session.')
    parser.add_argument('-l', '--sessions_list', action='store_true',
                        help='Downloads the list of sessions in CSV format.')
    parser.add_argument('-d', '--purchased_devs', action='store_true',
                        help='Downloads a list of purchased devices in CSV format.')

    parser.add_argument('-o', '--out', action='store',
                        help='Output file (for single files) or path (for multiple files).')

    args = parser.parse_args()

    e4c = E4Connect()

    if args.users_file:
        credentials = []
        with open(args.users_file, 'r') as f:
            for line in f.readlines():
                match = re.match('^(.*@.*):(.*)$', line)
                if match:
                    credentials.append(match.groups())

        for user, pwd in credentials:
            print('Authenticating... (%s)' % user)
            e4c.auth(user, pwd)
            user_name = user.split('@')[0] if '@' in user else user
            user_path = os.path.join(args.out or DEFAULT_OUT_PATH, user_name)
            if not os.path.isdir(user_path):
                os.makedirs(user_path)
            sessions_list = e4c.sessions_list()

            for session in sessions_list:
                if not os.path.exists(os.path.join(user_path, '%s.zip' % session['id'])):
                    print('Downloading %s...' % session['id'])
                    e4c.download_session(session['id'], user_path)
                else:
                    print('Skipping %s... (already exists)' % session['id'])

            if args.sessions_list and sessions_list:
                sessions_path = os.path.join(user_path, DEFAULT_CSV_SESSIONS)
                with open(sessions_path, 'w') as f:
                    f.write(DELIM.join(sessions_list[0].keys()))
                    for session in sessions_list:
                        f.write('\n' + DELIM.join(session.values()))

            if args.purchased_devs:
                purchases_list = e4c.purchased_devices()

                if purchases_list:
                    devices_path = os.path.join(user_path, DEFAULT_CSV_DEVICES)
                    with open(devices_path, 'w') as f:
                        f.write(DELIM.join(purchases_list[0].keys()))
                        for p in purchases_list:
                            f.write('\n' + DELIM.join(p.values()))

    else:
        # Retrieve credentials
        if not (args.user or 'E4_USER' in os.environ) or not (args.pwd or 'E4_PWD' in os.environ):
            raise Exception('Credentials must be specified by params or environ variables (E4_USER, E4_PWD)')
        user = args.user or os.environ['E4_USER']
        pwd = args.pwd or os.environ['E4_PWD']

        e4c.auth(user, pwd)

        if args.sessions_list or args.all_sessions:
            sessions_list = e4c.sessions_list()

            if args.sessions_list:
                if sessions_list:
                    args.out = os.path.join(args.out, DEFAULT_CSV_SESSIONS) if args.out and os.path.isdir(args.out) else None
                    with open(args.out or DEFAULT_CSV_SESSIONS, 'w') as f:
                        f.write(DELIM.join(sessions_list[0].keys()))
                        for session in sessions_list:
                            f.write('\n' + DELIM.join(session.values()))
            elif args.all_sessions:
                for session in sessions_list:
                    print('Downloading %s...' % session['id'])
                    e4c.download_session(session['id'], args.out or DEFAULT_OUT_PATH)

        elif args.session_id:
            print('Downloading %s...' % args.session_id)
            e4c.download_session(args.session_id, args.out or DEFAULT_OUT_PATH)

        elif args.purchased_devs:
            purchases_list = e4c.purchased_devices()

            if purchases_list:
                args.out = os.path.join(args.out, DEFAULT_CSV_DEVICES) if args.out and os.path.isdir(args.out) else None
                with open(args.out or DEFAULT_CSV_DEVICES, 'w') as f:
                    f.write(DELIM.join(purchases_list[0].keys()))
                    for p in purchases_list:
                        f.write('\n' + DELIM.join(p.values()))







