/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License 2.0        
 *  which accompanies this distribution, and is available at                  
 *  https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 *  SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 */
 package org.eclipse.osbp.utils.vaadin;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Pattern;

import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent;
import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherCommand;
import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
import org.eclipse.osbp.runtime.common.util.BeanUtils;
import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;

import com.vaadin.data.util.ObjectProperty;
import com.vaadin.server.ClientConnector.DetachListener;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.TextField;
import com.vaadin.ui.Window;

public class DTOInfoDialog extends Window implements DetachListener {	//NOSONAR
	/**
	 * 
	 */
	private static final long serialVersionUID = 3461161019240158996L;
	private Button close;
	private String sender;
	private String titleExtra;
	private String topic;
	private TextField createdByText;
	private TextField createdAtText;
	private TextField updatedByText;
	private TextField updatedAtText;
	private transient IEventDispatcher eventDispatcher;
	private transient IDSLMetadataService dslMetadataService;
	private static final String closeString = "close";
	private static final String titleString = "information";
	private static final String updatedByString = "updated_by";
	private static final String updatedAtString = "updated_at";
	private static final String createdByString = "created_by";
	private static final String createdAtString = "created_at";
	private static final String unknown = "unknown";
	private String unknownValue;
    private DateFormat dateFormat;
	private ObjectProperty<String> createdByProp;
	private ObjectProperty<String> createdAtProp;
	private ObjectProperty<String> updatedByProp;
	private ObjectProperty<String> updatedAtProp;
	private MPerspective perspective;

	public DTOInfoDialog(IEclipseContext eclipseContext, Locale locale, String sender, String topic) {
		super();
		this.dslMetadataService = eclipseContext.get(IDSLMetadataService.class);
		this.eventDispatcher = eclipseContext.get(IEventDispatcher.class);
		this.perspective = eclipseContext.get(MPerspective.class);
		this.addDetachListener(this);
		this.sender = sender;
		this.topic = topic;
		String[] parts = sender.split(Pattern.quote("."));
		titleExtra = parts[parts.length-1];
		setClosable(true);
		setModal(false);
		FormLayout subContent = new FormLayout();
		subContent.setMargin(true);
		setContent(subContent);
		createdByText = new TextField();
		createdByText.setReadOnly(true);
		subContent.addComponent(createdByText);
		createdAtText = new TextField();
		createdAtText.setReadOnly(true);
		subContent.addComponent(createdAtText);
		updatedByText = new TextField();
		updatedByText.setReadOnly(true);
		subContent.addComponent(updatedByText);
		updatedAtText = new TextField();
		updatedAtText.setReadOnly(true);
		subContent.addComponent(updatedAtText);
		
		createdByProp = new ObjectProperty<>("");
		createdAtProp = new ObjectProperty<>("");
		updatedByProp = new ObjectProperty<>("");
		updatedAtProp = new ObjectProperty<>("");
		
		createdByText.setPropertyDataSource(createdByProp);
		createdAtText.setPropertyDataSource(createdAtProp);
		updatedByText.setPropertyDataSource(updatedByProp);
		updatedAtText.setPropertyDataSource(updatedAtProp);
		
		close = new Button();
		close.addClickListener(new Button.ClickListener() {
			private static final long serialVersionUID = 5512635792523351385L;
			@Override
			public void buttonClick(ClickEvent event) {
	    		EventDispatcherEvent evnt = new EventDispatcherEvent(perspective, EventDispatcherCommand.CLOSE, topic, sender);
	    		eventDispatcher.sendEvent(evnt);
			}
		});
		subContent.addComponent(close);
		setLocale(locale);
		center();
	}
	
	@Override
	public void setLocale(Locale locale) {
		super.setLocale(locale);
		setCaption(dslMetadataService.translate(locale.toLanguageTag(), titleString) + " " + dslMetadataService.translate(locale.toLanguageTag(), titleExtra));
		createdByText.setCaption(dslMetadataService.translate(locale.toLanguageTag(), createdByString));
		createdAtText.setCaption(dslMetadataService.translate(locale.toLanguageTag(), createdAtString));
		updatedByText.setCaption(dslMetadataService.translate(locale.toLanguageTag(), updatedByString));
		updatedAtText.setCaption(dslMetadataService.translate(locale.toLanguageTag(), updatedAtString));
		unknownValue = dslMetadataService.translate(locale.toLanguageTag(), unknown);
		close.setCaption(dslMetadataService.translate(locale.toLanguageTag(), closeString));
		dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, locale);
		dateFormat.setLenient(false);
	}
	
	public void setDto(Object dto) {
		if(dto == null) {
			return;
		}
		String createUser = BeanUtils.getCreateUser(dto);
		if(createUser != null) {
			createdByProp.setValue(createUser);
		} else {
			createdByProp.setValue(unknownValue);
		}
		Date createdAt = BeanUtils.getCreateAt(dto);
		if(createdAt != null) {
			createdAtProp.setValue(dateFormat.format(createdAt));
		} else {
			createdAtProp.setValue(unknownValue);
		}
		
		String updateUser = BeanUtils.getUpdateUser(dto);
		if(updateUser != null) {
			updatedByProp.setValue(updateUser);
		} else {
			updatedByProp.setValue(unknownValue);
		}
		Date updatedAt = BeanUtils.getUpdateAt(dto);
		if(updatedAt != null) {
			updatedAtProp.setValue(dateFormat.format(updatedAt));
		} else {
			updatedAtProp.setValue(unknownValue);
		}
	}

	@Override
	public void detach(DetachEvent event) {
		EventDispatcherEvent evt = new EventDispatcherEvent(perspective, EventDispatcherCommand.CLOSE, topic, sender);
		eventDispatcher.sendEvent(evt);
	}
}
