# Copyright 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.
# pylint: disable=wrong-import-position

import google  # provided by GAE
import imp
import os
import sys

from . import utils

# Adds third_party to sys.path so the packages inside work.  Do not
# import third_party directly - it mysteriously flakes on GAE under
# heavy load.
third_party_dir = os.path.join(os.path.dirname(__file__), 'third_party')
if third_party_dir not in sys.path:  # pragma: no cover
  sys.path.insert(0, third_party_dir)

# Add the gae_ts_mon/protobuf directory into the path for the google package, so
# "import google.protobuf" works.
protobuf_dir = os.path.join(os.path.dirname(__file__), 'protobuf')
google.__path__.append(os.path.join(protobuf_dir, 'google'))
sys.path.insert(0, protobuf_dir)

# Pretend that we are the infra_libs.ts_mon package, so users can use the same
# import lines in gae and non-gae code.
if 'infra_libs' not in sys.modules:  # pragma: no cover
  sys.modules['infra_libs'] = imp.new_module('infra_libs')

sys.modules['infra_libs'].ts_mon = sys.modules[__package__]
sys.modules['infra_libs.ts_mon'] = sys.modules[__package__]
sys.modules['infra_libs'].utils = utils
sys.modules['infra_libs.utils'] = utils

# Put the httplib2_utils package into infra_lib directly.
import infra_libs.ts_mon.httplib2_utils
sys.modules['infra_libs'].httplib2_utils = infra_libs.ts_mon.httplib2_utils
sys.modules['infra_libs.httplib2_utils'] = infra_libs.ts_mon.httplib2_utils

from config import DjangoMiddleware
from config import initialize
from config import instrument_endpoint
from config import instrument_wsgi_application
from config import reset_for_unittest
from infra_libs.ts_mon.handlers import app
from infra_libs.ts_mon.handlers import TSMonJSHandler

# The remaining lines are copied from infra_libs/ts_mon/__init__.py.
from infra_libs.ts_mon.common.distribution import Distribution
from infra_libs.ts_mon.common.distribution import FixedWidthBucketer
from infra_libs.ts_mon.common.distribution import GeometricBucketer

from infra_libs.ts_mon.common.errors import MonitoringError
from infra_libs.ts_mon.common.errors import MonitoringDecreasingValueError
from infra_libs.ts_mon.common.errors import MonitoringDuplicateRegistrationError
from infra_libs.ts_mon.common.errors import MonitoringIncrementUnsetValueError
from infra_libs.ts_mon.common.errors import MonitoringInvalidFieldTypeError
from infra_libs.ts_mon.common.errors import MonitoringInvalidValueTypeError
from infra_libs.ts_mon.common.errors import MonitoringTooManyFieldsError
from infra_libs.ts_mon.common.errors import MonitoringNoConfiguredMonitorError
from infra_libs.ts_mon.common.errors import MonitoringNoConfiguredTargetError

from infra_libs.ts_mon.common.helpers import ScopedIncrementCounter
from infra_libs.ts_mon.common.helpers import ScopedMeasureTime

from infra_libs.ts_mon.common.interface import close
from infra_libs.ts_mon.common.interface import flush
from infra_libs.ts_mon.common.interface import register_global_metrics
from infra_libs.ts_mon.common.interface import register_global_metrics_callback

from infra_libs.ts_mon.common.metrics import BooleanField
from infra_libs.ts_mon.common.metrics import IntegerField
from infra_libs.ts_mon.common.metrics import StringField

from infra_libs.ts_mon.common.metrics import BooleanMetric
from infra_libs.ts_mon.common.metrics import CounterMetric
from infra_libs.ts_mon.common.metrics import CumulativeDistributionMetric
from infra_libs.ts_mon.common.metrics import CumulativeMetric
from infra_libs.ts_mon.common.metrics import FloatMetric
from infra_libs.ts_mon.common.metrics import GaugeMetric
from infra_libs.ts_mon.common.metrics import MetricsDataUnits
from infra_libs.ts_mon.common.metrics import NonCumulativeDistributionMetric
from infra_libs.ts_mon.common.metrics import StringMetric

from infra_libs.ts_mon.common.targets import TaskTarget
from infra_libs.ts_mon.common.targets import DeviceTarget
