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