# 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 argparse
import os
import sys
import traceback

import perf_insights
from perf_insights import local_directory_corpus_driver
from perf_insights import get_trace_handles_query
from perf_insights import map_single_trace
from perf_insights import json_map_results


def Main(args):
  parser = argparse.ArgumentParser(
      description='Local bulk trace processing')
  parser.add_argument('trace_directory')
  parser.add_argument('corpus_query_string')
  parser.add_argument('map_file')

  parser.add_argument('-o', '--output-file')
  parser.add_argument('-s', '--stop-on-error',
                      action='store_true')
  args = parser.parse_args(args)

  if not os.path.exists(args.trace_directory):
    args.error('trace_directory does not exist')
  if not os.path.exists(args.map_file):
    args.error('map does not exist')

  corpus_driver = local_directory_corpus_driver.LocalDirectoryCorpusDriver(
      os.path.abspath(os.path.expanduser(args.trace_directory)))
  query = get_trace_handles_query.GetTraceHandlesQuery.FromString(
      args.corpus_query_string)

  if args.output_file:
    ofile = open(args.output_file, 'w')
  else:
    ofile = sys.stdout

  map_results = json_map_results.JSONMapResults(ofile)
  try:
    _Run(map_results, corpus_driver, query, args.map_file,
         stop_on_error=args.stop_on_error)
  finally:
    if ofile != sys.stdout:
      ofile.close()

  if map_results.had_failures:
    return 255
  return 0

def _Run(map_results, corpus_driver, query, map_file,
         stop_on_error=False):

  trace_handles = corpus_driver.GetTraceHandlesMatchingQuery(query)

  map_results.WillMapTraces()

  failure_to_dump = None
  for trace_handle in trace_handles:
    map_results.WillMapSingleTrace(trace_handle)
    result_value = map_single_trace.MapSingleTrace(
        trace_handle,
        os.path.abspath(map_file))
    map_results.DidMapSingleTrace(trace_handle, result_value)
    if stop_on_error and result_value['type'] == 'failure':
      failure_to_dump = (trace_handle, result_value)
      break
  map_results.DidMapTraces()

  if failure_to_dump:
    sys.stderr.write('\n\nWhile mapping %s:\n' %
                     failure_to_dump[0].run_info.display_name)
    sys.stderr.write(failure_to_dump[1]['stack_str'])
    sys.stderr.write('\n')