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

"""Django models for cidb tables."""

from __future__ import print_function

from django.db import models

from build_annotations import fields as ba_fields


class BaseModel(models.Model):
  """Abstract base class to store all app-wide Meta options."""

  class Meta(object):
    """Set meta options for all models in this module."""
    # This property not inherited.
    abstract = True

    # The schema for CIDB is maintained external to this app.
    managed = False
    # Allow us to split the models.py file into different modules.
    app_label = 'cq_stats_sheet'
    # Each model should explicitly set this option. The default django model to
    # table name mapping does not work for us.
    db_table = 'Please define me'

  def __iter__(self):
    for field_name in self._meta.get_all_field_names():
      value = None
      if hasattr(self, field_name):
        value = getattr(self, field_name)
      yield field_name, value

  def __unicode__(self):
    result = []
    for _, value in self:
      result.append(unicode(value))
    return u', '.join(result)

  def __str__(self):
    return str(unicode(self))


class BuildTable(BaseModel):
  """Model for cidb.buildTable."""

  class Meta(object):
    """Set extra table options."""
    db_table = 'buildTable'

  id = ba_fields.ReadOnlyIntegerField(primary_key=True)
  last_updated = ba_fields.ReadOnlyDateTimeField()
  master_build_id = ba_fields.ReadOnlyForeignKey('self',
                                                 db_column='master_build_id')
  buildbot_generation = ba_fields.ReadOnlyIntegerField()
  builder_name = ba_fields.ReadOnlyCharField()
  waterfall = ba_fields.ReadOnlyCharField()
  build_number = ba_fields.ReadOnlyIntegerField()
  build_config = ba_fields.ReadOnlyCharField()
  bot_hostname = ba_fields.ReadOnlyCharField()
  start_time = ba_fields.ReadOnlyDateTimeField()
  finish_time = ba_fields.ReadOnlyDateTimeField()
  status = ba_fields.ReadOnlyCharField()
  status_pickle = ba_fields.ReadOnlyBlobField()
  build_type = ba_fields.ReadOnlyCharField()
  chrome_version = ba_fields.ReadOnlyCharField()
  milestone_version = ba_fields.ReadOnlyCharField()
  platform_version = ba_fields.ReadOnlyCharField()
  full_version = ba_fields.ReadOnlyCharField()
  sdk_version = ba_fields.ReadOnlyCharField()
  toolchain_url = ba_fields.ReadOnlyURLField()
  final = ba_fields.ReadOnlyBooleanField()
  metadata_url = ba_fields.ReadOnlyURLField()
  summary = ba_fields.ReadOnlyCharField()
  deadline = ba_fields.ReadOnlyDateTimeField()


class BuildStageTable(BaseModel):
  """Model for cidb.buildStageTable."""

  class Meta(object):
    """Set extra table options."""
    db_table = 'buildStageTable'

  # Not used directly in field definition for readonly tables, but used
  # elsewhere as constants.
  FAIL = 'fail'
  PASS = 'pass'
  INFLIGHT = 'inflight'
  MISSING = 'missing'
  PLANNED = 'planned'
  SKIPPED = 'skipped'
  FORGIVEN = 'forgiven'
  STATUS_CHOICES = (
      (FAIL, 'Stage failed'),
      (PASS, 'Stage passed! Hurray!'),
      (INFLIGHT, 'Stage is inflight'),
      (MISSING, 'Status missing'),
      (PLANNED, 'Stage is planned'),
      (SKIPPED, 'Stage skipped'),
      (FORGIVEN, 'Stage failed but forgiven'))

  id = ba_fields.ReadOnlyIntegerField(primary_key=True)
  build_id = ba_fields.ReadOnlyForeignKey('BuildTable',
                                          db_column='build_id')
  name = ba_fields.ReadOnlyCharField()
  board = ba_fields.ReadOnlyCharField()
  status = ba_fields.ReadOnlyEnumField()
  last_updated = ba_fields.ReadOnlyDateTimeField()
  start_time = ba_fields.ReadOnlyDateTimeField()
  finish_time = ba_fields.ReadOnlyDateTimeField()
  final = ba_fields.ReadOnlyBooleanField()


class ClActionTable(BaseModel):
  """Model for cidb.clActionTable."""

  class Meta(object):
    """Set extra table options."""
    db_table = 'clActionTable'

  # Not used directly in field definition for readonly tables, but used
  # elsewhere as constants.
  PICKED_UP = 'picked_up'
  SUBMITTED = 'submitted'
  KICKED_OUT = 'kicked_out'
  SUBMIT_FAILED = 'submit_failed'
  VERIFIED = 'verified'
  FORGIVEN = 'forgiven'
  # This list of choices is not exhaustive yet. It's only enough for CQ stats.
  ACTION_CHOICES = (
      (PICKED_UP, 'CL picked up by CQ'),
      (SUBMITTED, 'CL submitted by CQ'),
      (KICKED_OUT, 'CL kicked out by CQ'),
      (SUBMIT_FAILED, 'CQ failed to submit CL'),
      (VERIFIED, 'CL verified by CQ'),
      (FORGIVEN, 'CQ run failed, but CL forgiven'))

  id = ba_fields.ReadOnlyIntegerField(primary_key=True)
  build_id = ba_fields.ReadOnlyForeignKey('BuildTable',
                                          db_column='build_id')
  change_number = ba_fields.ReadOnlyIntegerField()
  patch_number = ba_fields.ReadOnlyIntegerField()
  change_source = ba_fields.ReadOnlyEnumField()
  action = ba_fields.ReadOnlyEnumField()
  reason = ba_fields.ReadOnlyCharField()
  timestamp = ba_fields.ReadOnlyDateTimeField()


class FailureTable(BaseModel):
  """Model for cidb.failureTable."""

  class Meta(object):
    """Set extra table options."""
    db_table = 'failureTable'

  id = ba_fields.ReadOnlyIntegerField(primary_key=True)
  build_stage_id = ba_fields.ReadOnlyForeignKey('BuildStageTable',
                                                db_column='build_stage_id')
  outer_failure_id = ba_fields.ReadOnlyForeignKey('self',
                                                  db_column='outer_failure_id')
  exception_type = ba_fields.ReadOnlyCharField()
  exception_message = ba_fields.ReadOnlyCharField()
  exception_category = ba_fields.ReadOnlyEnumField()
  extra_info = ba_fields.ReadOnlyCharField()
  timestamp = ba_fields.ReadOnlyDateTimeField()


class AnnotationsTable(BaseModel):
  """Model for cidb.annotationsTable."""

  class Meta(object):
    """Set extra table options."""
    db_table = 'annotationsTable'

  BAD_CL = 'bad_cl'
  BUG_IN_TOT = 'bug_in_tot'
  MERGE_CONFLICT = 'merge_conflict'
  TREE_CONFLICT = 'tree_conflict'
  SCHEDULED_ABORT = 'scheduled_abort'
  CL_NOT_READY = 'cl_not_ready'
  BAD_CHROME = 'bad_chrome'
  TEST_FLAKE = 'test_flake'
  GERRIT_FAILURE = 'gerrit_failure'
  GS_FAILURE = 'gs_failure'
  LAB_FAILURE = 'lab_failure'
  BAD_BINARY_FAILURE = 'bad_binary_failure'
  BUILD_FLAKE = 'build_flake'
  INFRA_FAILURE = 'infra_failure'
  MYSTERY = 'mystery'
  FAILURE_CATEGORY_CHOICES = (
      (BAD_CL, 'Bad CL (Please specify CL)'),
      (BUG_IN_TOT, 'Bug in ToT (Please specify bug)'),
      (MERGE_CONFLICT, 'Merge conflict'),
      (TREE_CONFLICT, 'Tree conflict'),
      (SCHEDULED_ABORT, 'Scheduled Abort'),
      (CL_NOT_READY, 'CL was marked not ready (Please specify CL)'),
      (BAD_CHROME, 'Bad chrome (Please speficy bug)'),
      (TEST_FLAKE, 'Test flake'),
      (GERRIT_FAILURE, 'Gerrit failure'),
      (GS_FAILURE, 'Google Storage failure'),
      (LAB_FAILURE, 'Lab failure'),
      (BAD_BINARY_FAILURE, 'Bad binary packages'),
      (BUILD_FLAKE, 'Local build flake'),
      (INFRA_FAILURE, 'Other Infrastructure failure'),
      (MYSTERY, 'Unknown failure: MyStErY'))

  # Warning: Some field constraints are duplicated here from the database
  # schema in CIDB.
  id = models.AutoField(primary_key=True)
  build_id = models.ForeignKey('BuildTable', db_column='build_id')
  last_updated = models.DateTimeField(auto_now=True)
  last_annotator = models.CharField(max_length=80)
  failure_category = models.CharField(
      max_length=max(len(x) for x, y in FAILURE_CATEGORY_CHOICES),
      choices=FAILURE_CATEGORY_CHOICES,
      default='mystery')
  failure_message = models.CharField(max_length=1024, blank=True, null=True)
  blame_url = models.CharField(max_length=80, blank=True, null=True)
  notes = models.CharField(max_length=1024, blank=True, null=True)
  deleted = models.BooleanField(default=False, null=False)
