package fr.openwide.maven.artifact.notifier.web.application.console.importation.page;

import java.io.File;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Session;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.markup.html.form.upload.FileUpload;
import org.apache.wicket.markup.html.form.upload.FileUploadField;
import org.apache.wicket.markup.html.link.ResourceLink;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fr.openwide.core.commons.util.mime.MediaType;
import fr.openwide.core.wicket.more.console.template.ConsoleTemplate;
import fr.openwide.maven.artifact.notifier.core.config.application.MavenArtifactNotifierConfigurer;
import fr.openwide.maven.artifact.notifier.core.util.init.service.IProjectImportDataService;
import fr.openwide.maven.artifact.notifier.web.application.console.importation.page.resource.ProjectImportModelResourceReference;
import fr.openwide.maven.artifact.notifier.web.application.console.importation.template.ConsoleImportTemplate;

public class ConsoleImportProjectPage extends ConsoleImportTemplate {
	
	private static final long serialVersionUID = 2614078069284835152L;
	
	private static final Logger LOGGER = LoggerFactory.getLogger(ConsoleImportProjectPage.class);
	
	public static final String EXCEL_CONTENT_TYPE = MediaType.APPLICATION_MS_EXCEL.mime();
	
	private IModel<List<FileUpload>> fileUploadsModel;
	
	@SpringBean
	private IProjectImportDataService projectImportDataService;
	
	@SpringBean
	private MavenArtifactNotifierConfigurer configurer;
	
	public ConsoleImportProjectPage(PageParameters parameters) {
		super(parameters);
		
		addHeadPageTitleKey("console.import.project");
		
		// File select form
		final FileUploadField fileSelect = new FileUploadField("fileSelectInput", this.fileUploadsModel);
		fileSelect.setLabel(new ResourceModel("console.import.project.file"));
		fileSelect.add(AttributeModifier.replace("accept", getAcceptAttribute()));
		
		Form<Void> form = new Form<Void>("fileSelectForm") {
			private static final long serialVersionUID = 1L;

			@Override
			protected void onSubmit() {
				File file = null;
				try {
					FileUpload fileUpload = fileSelect.getFileUpload();
					
					if (fileUpload == null) {
						getSession().error(getString("console.import.project.error.noFile"));
						return;
					}
					
					file = File.createTempFile("uploaded-", ".xls", configurer.getTmpDirectory());
					fileUpload.writeTo(file);
					
					projectImportDataService.importProjects(file);
					
					Session.get().success(getString("console.import.project.success"));
				} catch (Exception e) {
					LOGGER.error("Unable to parse " + fileSelect.getFileUpload().getClientFileName() + " file", e);
					
					Session.get().error(getString("console.import.project.error"));
				} finally {
					FileUtils.deleteQuietly(file);
				}
			}
		};
		form.add(fileSelect);
		
		// Example excel file download link
		form.add(new ResourceLink<Void>("downloadTemplate", ProjectImportModelResourceReference.get()));
		
		form.add(new SubmitLink("importButton"));
		
		add(form);
	}
	
	protected IModel<String> getAcceptAttribute() {
		return Model.of(MediaType.APPLICATION_OPENXML_EXCEL.mime() + "," + MediaType.APPLICATION_MS_EXCEL.mime());
	}
	
	@Override
	protected Class<? extends ConsoleTemplate> getMenuItemPageClass() {
		return ConsoleImportProjectPage.class;
	}
}