/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
//         www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard ([email protected])
//
// ProjectForge is dual-licensed.
//
// This community edition 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 3 of the License.
//
// This community edition 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; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////

package org.projectforge.web.fibu;

import java.math.BigDecimal;
import java.util.Iterator;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.projectforge.core.NumberFormatter;
import org.projectforge.fibu.AuftragsPositionVO;
import org.projectforge.web.wicket.AbstractEditPage;
import org.projectforge.web.wicket.AbstractSecuredPage;
import org.projectforge.web.wicket.WicketUtils;


/**
 * This panel shows order positions including links to the corresponding order pages.
 * @author Kai Reinhard ([email protected])
 * 
 */
public class OrderPositionsPanel extends Panel
{
  private static final long serialVersionUID = 3427047480792831602L;

  public OrderPositionsPanel(final String id)
  {
    super(id);
  }

  @SuppressWarnings("serial")
  public void init(final Set<AuftragsPositionVO> orderPositions)
  {
    final RepeatingView positionsRepeater = new RepeatingView("pos");
    add(positionsRepeater);
    if (orderPositions != null) {
      final Iterator<AuftragsPositionVO> it = orderPositions.iterator();
      int orderNumber = -1;
      StringBuffer buf = new StringBuffer();
      Link<String> link = null;
      BigDecimal totalPersonDays = BigDecimal.ZERO;
      AuftragsPositionVO previousOrderPosition = null;
      while (it.hasNext() == true) {
        final AuftragsPositionVO orderPosition = it.next();
        if (orderPosition.getAuftragNummer() != null && orderNumber != orderPosition.getAuftragNummer().intValue()) {
          orderNumber = orderPosition.getAuftragNummer();
          final WebMarkupContainer item = new WebMarkupContainer(positionsRepeater.newChildId());
          positionsRepeater.add(item);
          final Label separatorLabel = new Label("separator", ", ");
          if (previousOrderPosition != null) {
            // Previous order position finished.
            addTitleAttribute(link, previousOrderPosition, totalPersonDays, buf);
            buf = new StringBuffer();
            totalPersonDays = BigDecimal.ZERO;
          } else {
            separatorLabel.setVisible(false); // Invisible for first entry.
          }
          previousOrderPosition = orderPosition;
          item.add(separatorLabel);
          link = new Link<String>("link") {
            @Override
            public void onClick()
            {
              final PageParameters params = new PageParameters();
              params.add(AbstractEditPage.PARAMETER_KEY_ID, String.valueOf(orderPosition.getAuftragId()));
              final AuftragEditPage page = new AuftragEditPage(params);
              page.setReturnToPage((AbstractSecuredPage) getPage());
              setResponsePage(page);
            };
          };
          item.add(link);
          link.add(new Label("label", String.valueOf(orderPosition.getAuftragNummer())));
        } else {
          buf.append("\n");
        }
        buf.append("#").append(orderPosition.getNumber()).append(" (");
        if (orderPosition.getPersonDays() != null) {
          buf.append(NumberFormatter.format(orderPosition.getPersonDays()));
          totalPersonDays = totalPersonDays.add(orderPosition.getPersonDays());
        } else {
          buf.append("??");
        }
        final String title = StringUtils.defaultString(orderPosition.getTitel());
        buf.append(" ").append(getString("projectmanagement.personDays.short")).append("): ").append(title);
        if (orderPosition.getStatus() != null) {
          if (StringUtils.isNotBlank(title) == true) {
            buf.append(", ");
          }
          buf.append(getString(orderPosition.getStatus().getI18nKey()));
        }
        if (it.hasNext() == false && link != null) {
          addTitleAttribute(link, orderPosition, totalPersonDays, buf);
        }
      }
    }
  }

  private void addTitleAttribute(final Link<String> link, final AuftragsPositionVO pos, final BigDecimal totalPersonDays,
      final StringBuffer buf)
  {
    final StringBuffer tooltip = new StringBuffer();
    tooltip.append(StringUtils.defaultString(pos.getAuftragTitle())).append(" (").append(
        NumberFormatter.format(totalPersonDays)).append(" ").append(getString("projectmanagement.personDays.short")).append(")");
    if (pos.getAuftragsStatus() != null) {
      tooltip.append(", ").append(getString(pos.getAuftragsStatus().getI18nKey()));
    }
    WicketUtils.addTooltip(link, tooltip.toString(), buf.toString());
  }
}