/*
 * Copyright (C) 2000 - 2022 Silverpeas
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * As a special exception to the terms and conditions of version 3.0 of
 * the GPL, you may redistribute this Program in connection with Free/Libre
 * Open Source Software ("FLOSS") applications as described in Silverpeas's
 * FLOSS exception.  You should have received a copy of the text describing
 * the FLOSS exception, and it is also available here:
 * "https://www.silverpeas.org/legal/floss_exception.html"
 *
 * 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.silverpeas.mobile.client.apps.agenda.pages.widgets;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Widget;
import org.silverpeas.mobile.client.apps.agenda.pages.EventPage;
import org.silverpeas.mobile.client.apps.agenda.resources.AgendaMessages;
import org.silverpeas.mobile.client.common.DateUtil;
import org.silverpeas.mobile.client.components.HTMLPanelClickable;
import org.silverpeas.mobile.shared.dto.almanach.CalendarDTO;
import org.silverpeas.mobile.shared.dto.almanach.CalendarEventDTO;
import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO;

import java.util.Date;

public class EventItem extends Composite {

  private ApplicationInstanceDTO instance;
  private CalendarEventDTO event;
  private CalendarDTO calendar;
  private static EventItemUiBinder uiBinder = GWT.create(EventItemUiBinder.class);
  @UiField
  DivElement eventName, calendarName, eventDate;

  @UiField
  HTMLPanelClickable container;

  @UiField
  HTML infos;

  protected AgendaMessages msg = null;

  interface EventItemUiBinder extends UiBinder<Widget, EventItem> {}

  public EventItem() {
    initWidget(uiBinder.createAndBindUi(this));
    msg = GWT.create(AgendaMessages.class);
  }

  public void setData(ApplicationInstanceDTO instance, CalendarEventDTO event, CalendarDTO calendar) {
    this.instance = instance;
    this.event = event;
    this.calendar = calendar;
    String attendee = "";
    if (!event.getAttendees().isEmpty()) {
      attendee = event.getAttendees().get(0).getFullName();
    }
    eventName.setInnerText(event.getTitle());
    calendarName.setInnerText(calendar.getTitle());

    DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd");
    if(event.getStartDate().contains("T")) {
      dtf = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mmZZZ");
    }
    Date startDate = dtf.parse(event.getStartDate());
    Date endDate = dtf.parse(event.getEndDate());

    if (event.isOnAllDay()) endDate.setTime(endDate.getTime()-1000);

    DateTimeFormat hoursformat = DateTimeFormat.getFormat("HH:mm");
    DateTimeFormat dayformat = DateTimeFormat.getFormat("EEEE");
    DateTimeFormat mouthformat = DateTimeFormat.getFormat("MMMM");
    DateTimeFormat df = DateTimeFormat.getFormat("dd");


    String startDateFormated = dayformat.format(startDate);
    String endDateFormated = dayformat.format(endDate);

    String startHourFormated = hoursformat.format(startDate);
    String endHourFormated = hoursformat.format(endDate);

    String date = "";
    if (startDateFormated.equals(endDateFormated) || (event.isOnAllDay() && isOnOneDay())) {
      String start = getDay(startDateFormated) + " " + df.format(startDate) + " " + getMouth(mouthformat.format(startDate));
      date = "<span>" + msg.the() + " <strong>" + start;
      if (!event.isOnAllDay()) date += " " + startHourFormated + " - " + endHourFormated;
      date += "</strong></span>";
    } else {
      String start = getDay(startDateFormated) + " " + df.format(startDate) + " " + getMouth(mouthformat.format(startDate));
      String end = getDay(endDateFormated) + " " + df.format(endDate) + " " + getMouth(mouthformat.format(endDate));
      date = "<span>" + msg.from() + " <strong>" + start;
      if (!event.isOnAllDay()) date += " " + startHourFormated;
      date += "</strong></span> <span>" + msg.toDay() + " " + end;
      if (!event.isOnAllDay()) date += " " + endHourFormated;
      date += "</span>";
    }

    eventDate.setInnerHTML(date);
  }

  private boolean isOnOneDay() {
      DateTimeFormat df = DateTimeFormat.getFormat("yyyy-MM-dd");
      Date start = df.parse(event.getStartDate());
      Date end = df.parse(event.getEndDate());
      end = DateUtil.addDays(end, -1);
      return (DateUtil.isSameDate(start, end));
  }

  public String getDay(String value) {
    String day = "";
    if (value.equalsIgnoreCase("monday")) {
      day = msg.monday();
    } else if (value.equalsIgnoreCase("tuesday")) {
      day = msg.tuesday();
    } else if (value.equalsIgnoreCase("wednesday")) {
      day = msg.wednesday();
    }  else if (value.equalsIgnoreCase("thursday")) {
      day = msg.thursday();
    } else if (value.equalsIgnoreCase("friday")) {
      day = msg.friday();
    } else if (value.equalsIgnoreCase("saturday")) {
      day = msg.saturday();
    } else if (value.equalsIgnoreCase("sunday")) {
      day = msg.sunday();
    }

    return day;
  }

  public String getMouth(String value) {
    String mouth = "";
    if (value.equalsIgnoreCase("january")) {
      mouth = msg.january();
    } else if(value.equalsIgnoreCase("february")) {
      mouth = msg.february();
    } else if(value.equalsIgnoreCase("march")) {
      mouth = msg.march();
    } else if(value.equalsIgnoreCase("april")) {
      mouth = msg.april();
    } else if(value.equalsIgnoreCase("may")) {
      mouth = msg.may();
    } else if(value.equalsIgnoreCase("june")) {
      mouth = msg.june();
    } else if(value.equalsIgnoreCase("july")) {
      mouth = msg.july();
    } else if(value.equalsIgnoreCase("august")) {
      mouth = msg.august();
    } else if(value.equalsIgnoreCase("september")) {
      mouth = msg.september();
    } else if(value.equalsIgnoreCase("october")) {
      mouth = msg.october();
    } else if(value.equalsIgnoreCase("november")) {
      mouth = msg.november();
    } else if(value.equalsIgnoreCase("december")) {
      mouth = msg.december();
    }

    return mouth;
  }

  public void showCalendarName(boolean show) {
    if (show) {
      calendarName.getStyle().clearVisibility();
    } else {
      calendarName.getStyle().setVisibility(Style.Visibility.HIDDEN);
    }
  }

  public String getYear() {
    String year;
    DateTimeFormat df = DateTimeFormat.getFormat("yyyy-MM-dd");
    if (event.getStartDate().contains("T")) {
      df = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mmZZZ");
    }
    Date d = df.parse(event.getStartDate());
    DateTimeFormat yf = DateTimeFormat.getFormat("yyyy");
    year = yf.format(d);
    return year;
  }

  @UiHandler("container")
  void openEvent(ClickEvent event) {
    EventPage page = new EventPage();
    page.setData(this.instance, this.event, calendar);
    page.show();
  }
}
