/*
 * Copyright (C) 2010-2014 Karel Zak <kzak@redhat.com>
 *
 * This file may be redistributed under the terms of the
 * GNU Lesser General Public License.
 */
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <getopt.h>

#include "c.h"
#include "nls.h"
#include "strutils.h"
#include "xalloc.h"

#include "libsmartcols.h"


enum { COL_NAME, COL_DESC, COL_FOO, COL_LIKE, COL_TEXT };

/* add columns to the @tb */
static void setup_columns(struct libscols_table *tb)
{
	if (!scols_table_new_column(tb, "NAME", 0, SCOLS_FL_TREE))
		goto fail;
	if (!scols_table_new_column(tb, "DESC", 0, 0))
		goto fail;
	if (!scols_table_new_column(tb, "FOO", 0, SCOLS_FL_WRAP))
		goto fail;
	if (!scols_table_new_column(tb, "LIKE", 0, SCOLS_FL_RIGHT))
		goto fail;
	if (!scols_table_new_column(tb, "TEXT", 0, SCOLS_FL_WRAP))
		goto fail;
	return;
fail:
	scols_unref_table(tb);
	err(EXIT_FAILURE, "failed to create output columns");
}

static char *gen_text(const char *prefix, const char *sub_prefix, char *buf, size_t sz)
{
	int x = snprintf(buf, sz,  "%s-%s-", prefix, sub_prefix);

	for ( ; (size_t)x < sz - 1; x++)
		buf[x] = *prefix;

	buf[x++] = 'x';
	buf[x] = '\0';
	return buf;
}

static struct libscols_line * add_line(	struct libscols_table *tb,
					struct libscols_line *parent,
					const char *prefix)
{
	char buf[BUFSIZ];
	struct libscols_line *ln = scols_table_new_line(tb, parent);
	if (!ln)
		err(EXIT_FAILURE, "failed to create output line");

	if (scols_line_set_data(ln, COL_NAME, gen_text(prefix, "N", buf, 15)))
		goto fail;
	if (scols_line_set_data(ln, COL_DESC, gen_text(prefix, "D", buf, 10)))
		goto fail;
	if (scols_line_set_data(ln, COL_FOO, gen_text(prefix, "U", buf, 55)))
		goto fail;
	if (scols_line_set_data(ln, COL_LIKE, "1"))
		goto fail;
	if (scols_line_set_data(ln, COL_TEXT, gen_text(prefix, "T", buf, 50)))
		goto fail;
	return ln;
fail:
	scols_unref_table(tb);
	err(EXIT_FAILURE, "failed to create output line");
}

int main(int argc, char *argv[])
{
	struct libscols_table *tb;
	struct libscols_line *ln, *xln;

	setlocale(LC_ALL, "");	/* just to have enable UTF8 chars */

	scols_init_debug(0);

	tb = scols_new_table();
	if (!tb)
		err(EXIT_FAILURE, "failed to create output table");

	scols_table_enable_colors(tb, isatty(STDOUT_FILENO));
	setup_columns(tb);

	ln = add_line(tb, NULL, "A");
	add_line(tb, ln, "aa");
	add_line(tb, ln, "ab");

	ln = add_line(tb, NULL, "B");
	xln = add_line(tb, ln, "ba");
	add_line(tb, xln, "baa");
	add_line(tb, xln, "bab");
	add_line(tb, ln, "bb");

	scols_print_table(tb);
	scols_unref_table(tb);
	return EXIT_SUCCESS;
}
