#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2014 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Simple command-line sample for the Google Prediction API

Command-line application that trains on your input data. This sample does
the same thing as the Hello Prediction! example. You might want to run
the setup.sh script to load the sample data to Google Storage.

Usage:
  $ python prediction.py "bucket/object" "model_id" "project_id"

You can also get help on all the command-line flags the program understands
by running:

  $ python prediction.py --help

To get detailed log output run:

  $ python prediction.py --logging_level=DEBUG
"""
from __future__ import print_function

__author__ = (
    "jcgregorio@google.com (Joe Gregorio), " "marccohen@google.com (Marc Cohen)"
)

import argparse
import pprint
import sys
import time

from apiclient import sample_tools
from oauth2client import client


# Time to wait (in seconds) between successive checks of training status.
SLEEP_TIME = 10


# Declare command-line flags.
argparser = argparse.ArgumentParser(add_help=False)
argparser.add_argument(
    "object_name", help="Full Google Storage path of csv data (ex bucket/object)"
)
argparser.add_argument(
    "model_id", help="Model Id of your choosing to name trained model"
)
argparser.add_argument("project_id", help="Project Id of your Google Cloud Project")


def print_header(line):
    """Format and print header block sized to length of line"""
    header_str = "="
    header_line = header_str * len(line)
    print("\n" + header_line)
    print(line)
    print(header_line)


def main(argv):
    # If you previously ran this app with an earlier version of the API
    # or if you change the list of scopes below, revoke your app's permission
    # here: https://accounts.google.com/IssuedAuthSubTokens
    # Then re-run the app to re-authorize it.
    service, flags = sample_tools.init(
        argv,
        "prediction",
        "v1.6",
        __doc__,
        __file__,
        parents=[argparser],
        scope=(
            "https://www.googleapis.com/auth/prediction",
            "https://www.googleapis.com/auth/devstorage.read_only",
        ),
    )

    try:
        # Get access to the Prediction API.
        papi = service.trainedmodels()

        # List models.
        print_header("Fetching list of first ten models")
        result = papi.list(maxResults=10, project=flags.project_id).execute()
        print("List results:")
        pprint.pprint(result)

        # Start training request on a data set.
        print_header("Submitting model training request")
        body = {"id": flags.model_id, "storageDataLocation": flags.object_name}
        start = papi.insert(body=body, project=flags.project_id).execute()
        print("Training results:")
        pprint.pprint(start)

        # Wait for the training to complete.
        print_header("Waiting for training to complete")
        while True:
            status = papi.get(id=flags.model_id, project=flags.project_id).execute()
            state = status["trainingStatus"]
            print("Training state: " + state)
            if state == "DONE":
                break
            elif state == "RUNNING":
                time.sleep(SLEEP_TIME)
                continue
            else:
                raise Exception("Training Error: " + state)

            # Job has completed.
            print("Training completed:")
            pprint.pprint(status)
            break

        # Describe model.
        print_header("Fetching model description")
        result = papi.analyze(id=flags.model_id, project=flags.project_id).execute()
        print("Analyze results:")
        pprint.pprint(result)

        # Make some predictions using the newly trained model.
        print_header("Making some predictions")
        for sample_text in ["mucho bueno", "bonjour, mon cher ami"]:
            body = {"input": {"csvInstance": [sample_text]}}
            result = papi.predict(
                body=body, id=flags.model_id, project=flags.project_id
            ).execute()
            print('Prediction results for "%s"...' % sample_text)
            pprint.pprint(result)

        # Delete model.
        print_header("Deleting model")
        result = papi.delete(id=flags.model_id, project=flags.project_id).execute()
        print("Model deleted.")

    except client.AccessTokenRefreshError:
        print(
            "The credentials have been revoked or expired, please re-run "
            "the application to re-authorize."
        )


if __name__ == "__main__":
    main(sys.argv)
