/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License") +  you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.openmeetings.web.admin.groups;

import static org.apache.openmeetings.web.app.Application.getBean;

import java.util.ArrayList;
import java.util.List;

import org.apache.openmeetings.db.dao.user.OrganisationUserDao;
import org.apache.openmeetings.db.entity.user.Organisation_Users;
import org.apache.openmeetings.db.entity.user.User;
import org.apache.openmeetings.web.admin.SearchableDataView;
import org.apache.openmeetings.web.app.WebSession;
import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
import org.apache.openmeetings.web.common.PagedEntityListPanel;
import org.apache.openmeetings.web.data.SearchableDataProvider;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;

public class GroupUsersPanel extends Panel {
	private static final long serialVersionUID = 1L;
	private long organisationId;
	private List<Organisation_Users> users2add = new ArrayList<Organisation_Users>();
	
	public GroupUsersPanel(String id, long orgId) {
		super(id);
		this.organisationId = orgId;
		setOutputMarkupId(true);
		
		SearchableDataView<Organisation_Users> dataView = new SearchableDataView<Organisation_Users>("userList", new OrgUserDataProvider()) {
			private static final long serialVersionUID = 1L;

			@Override
			protected void populateItem(Item<Organisation_Users> item) {
				final Organisation_Users orgUser = item.getModelObject();
				User u = orgUser.getUser();
				item.add(new CheckBox("isModerator").add(new OnChangeAjaxBehavior() {
					private static final long serialVersionUID = 1L;

					@Override
					protected void onUpdate(AjaxRequestTarget target) {
						if (orgUser.getOrganisation_users_id() != null) {
							getBean(OrganisationUserDao.class).update(orgUser, WebSession.getUserId());
						}
					}
				}));
				Label label = new Label("label", u == null ? "" : GroupForm.formatUser(u));
				if (orgUser.getOrganisation_users_id() == null) {
					label.add(AttributeAppender.append("class", "newItem"));
				}
				item.add(label);
				item.add(new ConfirmableAjaxBorder("deleteUserBtn", getString("80"), getString("833")) {
					private static final long serialVersionUID = 1L;

					@Override
					protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
						if (orgUser.getOrganisation_users_id() == null) {
							for (int i = 0; i < users2add.size(); ++i) {
								//FIXME ineffective
								if (users2add.get(i).getUser().getUser_id().equals(orgUser.getUser().getUser_id())) {
									users2add.remove(i);
									break;
								}
							}
						} else {
							getBean(OrganisationUserDao.class).delete(orgUser, WebSession.getUserId());
						}
						target.add(GroupUsersPanel.this);
					}
				});
			}
		};
		add(dataView).setOutputMarkupId(true);
		add(new PagedEntityListPanel("navigator", dataView) {
			private static final long serialVersionUID = 1L;

			@Override
			protected void onEvent(AjaxRequestTarget target) {
				target.add(GroupUsersPanel.this);
			}
		});
	}
	
	void update(long orgId) {
		organisationId = orgId;
		users2add.clear();
	}
	
	List<Organisation_Users> getUsers2add() {
		return users2add;
	}
	
	private class OrgUserDataProvider extends SearchableDataProvider<Organisation_Users> {
		private static final long serialVersionUID = 1L;

		OrgUserDataProvider() {
			super(OrganisationUserDao.class);
		}
		
		protected OrganisationUserDao getDao() {
			return (OrganisationUserDao)super.getDao();
		}
		
		public long size() {
			return users2add.size() + (search == null ? getDao().count(organisationId) : getDao().count(organisationId, search));
		}
		
		public java.util.Iterator<? extends Organisation_Users> iterator(long first, long count) {
			List<Organisation_Users> list = new ArrayList<Organisation_Users>();
			list.addAll(users2add);
			list.addAll(search == null && getSort() == null
					? getDao().get(organisationId, (int)first, (int)count)
					: getDao().get(organisationId, search, (int)first, (int)count, getSortStr()));
			
			return list.iterator();
		}
	}
}
