/* Copyright (c) 2012 Samsung Electronics Co., Ltd.
 *	http://www.samsung.com/
 *
 * This file is part of PowerTOP
 *
 * This program file is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program in a file named COPYING; if not, write to the
 * Free Software Foundation, Inc,
 * 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301 USA
 * or just google for it.
 *
 * Generic report generator.
 * Written by Igor Zhbanov <i.zhbanov@samsung.com>
 * 2012.10 */

#ifndef _REPORT_MAKER_H_
#define _REPORT_MAKER_H_

/* This report generator implements the following document structure:
 *	body
 *	  \---> section
 *		  |---> header
 *		  |---> paragraph
 *		  \---> table
 *			  \---> table row
 *				  \---> table cell
 *
 * The report body consists of a number of sections (a.k.a. <div>s,
 * a.k.a. tabs).
 * Each section can contain headers (<h1>, <h2>, <h3>), paragraphs (<p>)
 * and tables (<table>).
 *
 * A header is a single line of text.
 *
 * Paragraphs can contain only text.
 *
 * A table consists of table rows. A table row consists of table cells.
 * A table cell can contain only text.
 *
 * Each section, table, row or cell could have its own formatting.
 * To distinguish elements from others of its type, each element could have
 * an unique identifier (see enums section_type, table_type, row_type and
 * cell_type below). These identifiers are used in formatter implementations
 * to produce special formatting.
 *
 * Example of usage:
 *	report_maker report(REPORT_OFF);
 *
 *	report.set_type(REPORT_HTML);
 *	report.begin_section();
 *		report.add_header("Big report");
 *		report.begin_paragraph("Some text");
 *		report.begin_table();
 *			report.begin_row();
 *				report.begin_cell();
 *					report.add("Something");
 *				report.begin_cell(CELL_SPECIAL);
 *					report.add("Foo bar");
 *	report.finish_report();
 *	const char *result = report.get_result();
 */

#include <stdarg.h>

#include <string>

/* Conditional gettext. We need original strings for CSV. */
#define __(STRING) \
	((report.get_type() == REPORT_CSV) ? (STRING) : gettext(STRING))

#ifndef UNUSED
#define UNUSED __attribute__((unused))
#endif /* UNUSED */

/* ************************************************************************ */

enum report_type {
	REPORT_OFF,
	REPORT_HTML,
	REPORT_CSV
};

/* ************************************************************************ */

enum section_type {
	SECTION_DEFAULT,
	SECTION_SYSINFO,
	SECTION_CPUIDLE,
	SECTION_CPUFREQ,
	SECTION_DEVFREQ,
	SECTION_DEVPOWER,
	SECTION_SOFTWARE,
	SECTION_SUMMARY,
	SECTION_TUNING,
	SECTION_MAX /* Must be last in this enum */
};

/* ************************************************************************ */

enum table_type {
	TABLE_DEFAULT,
	TABLE_WIDE,
	TABLE_MAX /* Must be last in this enum */
};

/* ************************************************************************ */

enum row_type {
	ROW_DEFAULT,
	ROW_SYSINFO,
	ROW_DEVPOWER,
	ROW_SOFTWARE,
	ROW_SUMMARY,
	ROW_TUNABLE,
	ROW_TUNABLE_BAD,
	ROW_MAX /* Must be last in this enum */
};

/* ************************************************************************ */

enum cell_type {
	CELL_DEFAULT,
	CELL_SYSINFO,
	CELL_FIRST_PACKAGE_HEADER,
	CELL_EMPTY_PACKAGE_HEADER,
	CELL_CORE_HEADER,
	CELL_CPU_CSTATE_HEADER,
	CELL_CPU_PSTATE_HEADER,
	CELL_STATE_NAME,
	CELL_EMPTY_PACKAGE_STATE,
	CELL_PACKAGE_STATE_VALUE,
	CELL_CORE_STATE_VALUE,
	CELL_CPU_STATE_VALUE,
	CELL_SEPARATOR,
	CELL_DEVPOWER_HEADER,
	CELL_DEVPOWER_DEV_NAME,
	CELL_DEVPOWER_POWER,
	CELL_DEVPOWER_UTIL,
	CELL_DEVACTIVITY_PROCESS,
	CELL_DEVACTIVITY_DEVICE,
	CELL_SOFTWARE_HEADER,
	CELL_SOFTWARE_PROCESS,
	CELL_SOFTWARE_DESCRIPTION,
	CELL_SOFTWARE_POWER,
	CELL_SUMMARY_HEADER,
	CELL_SUMMARY_CATEGORY,
	CELL_SUMMARY_DESCRIPTION,
	CELL_SUMMARY_ITEM,
	CELL_TUNABLE_HEADER,
	CELL_UNTUNABLE_HEADER,
	CELL_MAX /* Must be last in this enum */
};

/* ************************************************************************ */

class report_formatter;

class report_maker
{
public:
	report_maker(report_type t);
       ~report_maker();

	report_type get_type();
	void set_type(report_type t);

	void addf(const char *fmt, ...)
				__attribute__ ((format (printf, 2, 3)));

	void finish_report();
	const char *get_result();
	void clear_result();

	void add(const char *str);

	void add_header(const char *header, int level = 2);
	void begin_section(section_type stype = SECTION_DEFAULT);
	void begin_table(table_type ttype = TABLE_DEFAULT);
	void begin_row(row_type rtype = ROW_DEFAULT);
	void begin_cell(cell_type ctype = CELL_DEFAULT);
	void add_empty_cell();
	void begin_paragraph();

	void set_cpu_number(int nr);

private:
	void setup_report_formatter();

	void end_section();
	void end_table();
	void end_row();
	void end_cell();
	void end_paragraph();

	report_type type;
	report_formatter *formatter;
	bool cell_opened, row_opened, table_opened, section_opened,
	     paragraph_opened;
};

#endif /* _REPORT_MAKER_H_ */
