#include "regional_state_area_report_generator.h"

 
void Xport_report_suite::regional_state_area_report_generator::create_header(Xport::document& doc) const
{
  using namespace Xport;

  *doc.title() << "Regional State Area Report";

  element head_div(Xport::div, "id_heading");

  markup::iterator it = head_div.insert(element(h1));
  *it << "US Regional Area Report";

  it = head_div.insert(element(h4));
  *it << "Each state is listed within it's region, along with Regional subtotals";

  *doc.body() << head_div;
}

void Xport_report_suite::regional_state_area_report_generator::create_report_body(Xport::document& doc) const
{
  using namespace Xport;

  int rgn = northeast;
  for (; rgn <= west; ++rgn) {
    std::ostringstream sRgn;
    sRgn << "Region" << rgn;
    element tbl(table, sRgn.str());
    create_region_table(tbl, rgn);
    doc.body()->insert(tbl);
  }
}

void Xport_report_suite::regional_state_area_report_generator::create_region_table(Xport::element& tbl, int rgn) const
{
  using namespace Xport;

  std::vector<state_info> siv;
  us_state_report_generator::get_regional_state_data(rgn, siv, sf_area, descending);
  std::vector<state_info>::const_iterator it = siv.begin();

  create_table_header(tbl, rgn);
  int rows = 0;
  long total_area = 0;
  for (; it != siv.end(); ++it, ++rows) {
    markup::iterator mit = tbl.insert(element(tr));
    *mit << (element(td) << it->name());
    *mit << (element(td) << it->abbr());
    *mit << (element(td) << numeric_format(it->area()));
    std::ostringstream sArea_rank;
    sArea_rank << it->area_rank();
    *mit << (element(td) << sArea_rank.str());
    total_area += it->area();
  }


  element footer_row(tr, "", "tbl_footer");
  footer_row << (element(td) << "Total Square Area");
  footer_row << element(td);
  footer_row << (element(td) << numeric_format(total_area) << " square miles.");
  footer_row << element(td);
  tbl.insert(footer_row);

  // now go back and insert the image cell in the first row, with a rowspan of all rows
  markup::iterator mit = tbl.begin();
  ++mit;
  mit = mit->insert(element(td, "", "img_cell"));
  std::ostringstream attr_val;
  attr_val << rows + 2;
  mit->attribute(rowspan, attr_val.str());

  // insert image in image cell
  mit = mit->insert(element(img));
  attr_val.str("");
  attr_val << "../img/region_" << rgn << ".png";
  mit->attribute(src, attr_val.str());

}



void Xport_report_suite::regional_state_area_report_generator::create_table_header(Xport::element& tbl, int rgn) const
{
  using namespace Xport;

  markup::iterator it_row = tbl.insert(element(tr));
  element hdr(th, "", "tbl_hdr");
  hdr << us_state_report_generator::get_region_name(rgn);
  hdr.attribute(colspan, "5");
  *it_row << hdr;

  it_row = tbl.insert(element(tr, "", "titles"));
  *it_row << (element(th) << "State");
  *it_row << (element(th) << "Abbr");
  *it_row << (element(th) << "Area (sq miles)");
  *it_row << (element(th) << "Area (Rank)");

}


void Xport_report_suite::regional_state_area_report_generator::create_footer(Xport::document& doc) const
{
  using namespace Xport;

  element lnk(a);
  lnk << "Wikipedia";
  lnk.attribute(href, "http://en.wikipedia.org/wiki/Wiki");

  *doc.body() << (element(Xport::div, "id_aknowledgement") << "Statistics and images courtesy of " << lnk);
}

void Xport_report_suite::regional_state_area_report_generator::create_stylesheet(Xport::document& doc, Xport::stylesheet& ss) const
{
  using namespace Xport;

  stylesheet::iterator it = ss.insert(stylesheet_rule("#id_heading"));
  *it << declaration(css::height, "80px")
      << declaration(background_color, "#66ffff")
      << declaration(margin, "20px")
      << declaration(css::border, "4px groove #009999")
      << declaration(padding, "10px")
      << declaration(css::width, "40%")
      << declaration(margin_left, "auto")
      << declaration(margin_right, "auto");

  it = ss.insert(stylesheet_rule("#id_heading h1"));
  *it << declaration(text_align, "center")
      << declaration(css::color, "center")
      << declaration(margin_bottom, "0px")
      << declaration(padding_bottom, "0px");

  it = ss.insert(stylesheet_rule("#id_heading h4"));
  *it << declaration(text_align, "center")
      << declaration(padding_top, "0px")
      << declaration(margin_top, "10px");

  it = ss.insert(stylesheet_rule("#id_aknowledgement"));
  *it << declaration(margin_right, "auto")
      << declaration(margin_left, "auto")
      << declaration(margin_top, "30px")
      << declaration(css::width, "50%")
      << declaration(background_color, "#ffcc00")
      << declaration(padding, "10px")
      << declaration(css::border, "4px double #990066")
      << declaration(text_align, "center");

  it = ss.insert(stylesheet_rule("table"));
  *it << declaration(css::clear, "right")
      << declaration(css::width, "70%")
      << declaration(css::border, "3px ridge green")
      << declaration(margin_right, "auto")
      << declaration(margin_left, "auto")
      << declaration(margin_top, "30px")
      << declaration(border_collapse, "collapse");

  it = ss.insert(stylesheet_rule("tr"));
  *it << declaration(background_color, "#ffffcc");

  it = ss.insert(stylesheet_rule(".titles th"));
  *it << declaration(text_align, "left")
      << declaration(border_bottom, "4px solid red")
      << declaration(background_color, "#ccffcc")
      << declaration(padding_left, "10px")
      << declaration(line_height, "150%");

  it = ss.insert(stylesheet_rule(".tbl_hdr"));
  *it << declaration(border_bottom, "4px solid red")
      << declaration(font_size, "x-large")
      << declaration(line_height, "150%")
      << declaration(css::color, "blue");

  it = ss.insert(stylesheet_rule("td"));
  *it << declaration(padding_left, "10px")
      << declaration(border_bottom, "1px solid gray");

  it = ss.insert(stylesheet_rule("td.img_cell"));
  *it << declaration(border_left, "4px solid red")
      << declaration(css::width, "220px")
      << declaration(background_color, "#ffffff");

  it = ss.insert(stylesheet_rule(".img_cell img"));
  *it << declaration(css::width, "200px")
      << declaration(css::height, "200px");

  element css_link(Xport::link);
  css_link.attribute(rel, "stylesheet");
  css_link.attribute(type, "text/css");
  css_link.attribute(href, "regional_state_area_report.css");
  *doc.head() << css_link;
}