def get_date_range(request):
    dates = []
    client = get_client()

    start_year = int(request.headers['start-year'])
    start_month = int(request.headers['start-month'])
    start_day = int(request.headers['start-day'])

    end_year = int(request.headers['end-year'])
    end_month = int(request.headers['end-month'])
    end_day = int(request.headers['end-day'])

    start = date(start_year, start_month, start_day)
    end = date(end_year, end_month, end_day)

    if start > end:
        raise InvalidUsage('Must enter valid date range.', status_code=400)
    else:
        for dt in rrule(DAILY, dtstart=start, until=end):
            year = int(dt.strftime("%Y"))
            month = int(dt.strftime("%m"))
            day = int(dt.strftime("%d"))
            dates.append(client.get_date(year, month, day))

        return dates
def get_entries_history():
    if 'username' in session:
        date_range = get_date_range(request)

        entries = {}
        for date in date_range:
            for meal in date.meals:
                for entry in meal:
                    if entry.short_name not in entries:
                        obj = {
                            'count': 1,
                            'nutrition': entry.nutrition_information
                        }
                        entries[entry.short_name] = obj
                    else:
                        entries[entry.short_name]['count'] += 1
                        old_entry = Counter(
                            entries[entry.short_name]['nutrition'])
                        new_entry = Counter(entry.nutrition_information)
                        concat_entry = old_entry + new_entry
                        entries[entry.short_name]['nutrition'] = concat_entry

        return jsonify(entries)
    else:
        raise InvalidUsage('Access Denied', status_code=403)
def logout():
    if 'username' not in session:
        raise InvalidUsage('Not Logged In', status_code=401)
    else:
        del clients[session['username']]
        session.clear()
        return jsonify(Success=True), 200
def login():
    if not request.json or not 'username' in request.json or not 'password' in request.json:
        return jsonify({"error": "Invalid request format"}), 404
    else:
        if session.get('logged_in'):
            return jsonify(success=True), 200
        else:
            try:
                # Strip the unicode
                username = str(request.json['username'])
                client = myfitnesspal.Client(username,
                                             request.json['password'])
                clients[username] = client
                session['logged_in'] = True
                session['username'] = username
                print('Querying...')
                if User.query.filter_by(username=username).first():
                    print("Successful login.")
                    return jsonify(success=True), 200
                else:
                    newUser = User(username, request.json['password'])
                    db.session.add(newUser)
                    db.session.commit()
                    print("User created.")
                    return jsonify(success=True), 200
            except ValueError:
                raise InvalidUsage('Invalid Credentials', status_code=401)
def range_meals():
    if 'username' in session:
        date_range = get_date_range(request)

        meals = {}
        for day in date_range:
            date = day.date.strftime('%m/%d/%Y')
            meals[date] = get_meals(day)
        return jsonify(meals)
    else:
        raise InvalidUsage('Access Denied', status_code=403)
def entries():
    if 'username' in session:
        date = get_date(request)

        entries = {}
        for meal in date.meals:
            for entry in meal:
                entryDict = entry.get_as_dict()
                entries[entryDict['name']] = entryDict['nutrition_information']
        return jsonify(entries)
    else:
        raise InvalidUsage('Access Denied', status_code=403)
def get_weight_history():
    if 'username' in session:
        client = get_client()

        start_year = int(request.headers['start-year'])
        start_month = int(request.headers['start-month'])
        start_day = int(request.headers['start-day'])

        end_year = int(request.headers['end-year'])
        end_month = int(request.headers['end-month'])
        end_day = int(request.headers['end-day'])

        start = date(start_year, start_month, start_day)
        end = date(end_year, end_month, end_day)

        if start > end:
            raise InvalidUsage('Must enter valid date range', status_code=400)
        else:
            weight = client.get_measurements('Weight', end, start)
            res = {k.strftime('%Y/%m/%d'): v for k, v in weight.iteritems()}
            return jsonify(res)
    else:
        raise InvalidUsage('Access Denied', status_code=403)
def get_weight():
    if 'username' in session:
        client = get_client()
        year = int(request.headers['year'])
        month = int(request.headers['month'])
        day = int(request.headers['day'])

        currentDate = date(year, month, day)
        try:
            weight = client.get_measurements(currentDate, currentDate)
            print(weight)
            return jsonify(weight)
        except ValueError:
            return jsonify({}), 204

    else:
        raise InvalidUsage('Access Denied', status_code=403)
def average_totals():
    print(session)
    if 'username' in session:
        date_range = get_date_range(request)

        totals = Counter(date_range[0].totals)
        days = len(date_range)

        if not totals:
            days -= 1

        for day in date_range[1:]:
            date = day.date.strftime('%m/%d/%Y')
            if day.totals:
                totals += Counter(day.totals)
            else:
                days -= 1
        for key in totals:
            totals[key] /= days
        return jsonify({'totals': totals, 'trackedDays': days})
    else:
        raise InvalidUsage('Access Denied', status_code=403)
def water():
    if 'username' in session:
        date = get_date(request)
        return jsonify(date.water)
    else:
        raise InvalidUsage('Access Denied', status_code=403)