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