# -*- coding: utf-8 -*-
# Copyright 2011 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.

"""Module to draw column chart."""


class ColumnChart(object):
  """class to draw column chart."""

  def __init__(self, title, width, height):
    self.title = title
    self.chart_div = ''.join(t for t in title if t.isalnum())
    self.width = width
    self.height = height
    self.columns = []
    self.rows = []
    self.series = []

  def AddSeries(self, column_name, series_type, color):
    for i in range(len(self.columns)):
      if column_name == self.columns[i][1]:
        self.series.append((i - 1, series_type, color))
        break

  def AddColumn(self, name, column_type):
    self.columns.append((column_type, name))

  def AddRow(self, row):
    self.rows.append(row)

  def GetJavascript(self):
    res = 'var data = new google.visualization.DataTable();\n'
    for column in self.columns:
      res += "data.addColumn('%s', '%s');\n" % column
    res += 'data.addRows(%s);\n' % len(self.rows)
    for row in range(len(self.rows)):
      for column in range(len(self.columns)):
        val = self.rows[row][column]
        if isinstance(val, str):
          val = "'%s'" % val
        res += 'data.setValue(%s, %s, %s);\n' % (row, column, val)

    series_javascript = ''
    for series in self.series:
      series_javascript += "%s: {type: '%s', color: '%s'}, " % series

    chart_add_javascript = """
var chart_%s = new google.visualization.ComboChart(
  document.getElementById('%s'));
chart_%s.draw(data, {width: %s, height: %s, title: '%s', legend: 'none',
  seriesType: "bars", lineWidth: 0, pointSize: 5, series: {%s},
  vAxis: {minValue: 0}})
"""

    res += chart_add_javascript % (self.chart_div, self.chart_div,
                                   self.chart_div, self.width, self.height,
                                   self.title, series_javascript)
    return res

  def GetDiv(self):
    return "<div id='%s' class='chart'></div>" % self.chart_div
