# Copyright (c) 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import json
import logging
import os
import re
import webapp2
import uuid

from perf_insights import trace_info
from perf_insights import cloud_config

import cloudstorage as gcs

from google.appengine.api import datastore_errors

default_retry_params = gcs.RetryParams(initial_delay=0.2,
                                       max_delay=5.0,
                                       backoff_factor=2,
                                       max_retry_period=15)
gcs.set_default_retry_params(default_retry_params)


class UploadPage(webapp2.RequestHandler):

  def get(self):
    self.response.out.write("""
          <html><body>
            <head><title>Performance Insights - Trace Uploader</title></head>
            <form action="/upload" enctype="multipart/form-data" method="post">
              <div><input type="file" name="trace"/></div>
              <div><input type="submit" value="Upload"></div>
            </form><hr>
          </body></html>""")

  def post(self):
    trace_uuid = str(uuid.uuid4())

    gcs_path = '/%s/%s.gz' % (
        cloud_config.Get().trace_upload_bucket, trace_uuid)
    gcs_file = gcs.open(gcs_path,
                        'w',
                        content_type='application/octet-stream',
                        options={},
                        retry_params=default_retry_params)
    gcs_file.write(self.request.get('trace'))
    gcs_file.close()

    trace_object = trace_info.TraceInfo(id=trace_uuid)
    trace_object.remote_addr = os.environ["REMOTE_ADDR"]

    for arg in self.request.arguments():
      arg_key = arg.replace('-', '_').lower()
      if arg_key in trace_object._properties:
        try:
          setattr(trace_object, arg_key, self.request.get(arg))
        except datastore_errors.BadValueError:
          pass

    scenario_config = self.request.get('config')
    if scenario_config:
      config_json = json.loads(scenario_config)
      if 'scenario_name' in config_json:
        trace_object.scenario_name = config_json['scenario_name']

    tags_string = self.request.get('tags')
    if tags_string:
      # Tags are comma separated and should only include alphanumeric + '-'.
      if re.match('^[a-zA-Z0-9-,]+$', tags_string):
        trace_object.tags = tags_string.split(',')
      else:
        logging.warning('The provided tags string includes one or more invalid'
                        ' characters and will be ignored')

    trace_object.ver = self.request.get('product-version')
    trace_object.put()

    self.response.write(trace_uuid)

app = webapp2.WSGIApplication([('/upload', UploadPage)])
