/********************************************************************************
 * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 ********************************************************************************/

package org.eclipse.mdm.businessobjects.boundary;

import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTTYPE;
import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID2;
import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID3;
import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
import static org.eclipse.mdm.businessobjects.utils.Decomposer.decompose;
import static org.eclipse.mdm.businessobjects.utils.ServiceUtils.L;
import static org.eclipse.mdm.businessobjects.utils.ServiceUtils.SL;

import javax.ejb.EJB;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

import org.eclipse.mdm.api.base.model.ContextType;
import org.eclipse.mdm.api.base.model.Environment;
import org.eclipse.mdm.api.dflt.model.TemplateAttribute;
import org.eclipse.mdm.api.dflt.model.TemplateComponent;
import org.eclipse.mdm.businessobjects.entity.MDMEntity;
import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
import org.eclipse.mdm.businessobjects.service.EntityService;
import org.eclipse.mdm.businessobjects.utils.ServiceUtils;

import io.swagger.v3.oas.annotations.tags.Tag;
import io.vavr.collection.List;

/**
 * {@link TemplateAttribute} resource handling REST requests
 * 
 * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
 *
 */
@Tag(name = "Template")
@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/tplroots/{" + REQUESTPARAM_CONTEXTTYPE + "}/{" + REQUESTPARAM_ID
		+ "}/tplcomps/{" + REQUESTPARAM_ID2 + "}/tplattrs")
public class TemplateAttributeResource {

	@EJB
	private EntityService entityService;

	/**
	 * Returns the found {@link TemplateAttribute}.
	 * 
	 * @param sourceName  name of the source (MDM {@link Environment} name)
	 * @param contextType {@link ContextType} of the {@link TemplateAttribute} to
	 *                    load
	 * @param id          id of the {@link TemplateAttribute}
	 * @return the found {@link TemplateAttribute} as {@link Response}
	 */
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/{" + REQUESTPARAM_ID3 + "}")
	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
			@PathParam(REQUESTPARAM_ID2) String tplCompId, @PathParam(REQUESTPARAM_ID3) String id) {
		return entityService
				.find(sourceName, TemplateAttribute.class, id, ServiceUtils.getContextTypeSupplier(contextTypeParam),
						SL(tplRootId, tplCompId))
				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
	}

	/**
	 * Returns the (filtered) {@link TemplateAttribute}s.
	 * 
	 * @param sourceName  name of the source (MDM {@link Environment} name)
	 * @param contextType {@link ContextType} of the {@link TemplateAttribute} to
	 *                    load
	 * @param filter      filter string to filter the {@link TemplateAttribute}
	 *                    result
	 * @return the (filtered) {@link TemplateAttribute}s as {@link Response}
	 */
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
			@PathParam(REQUESTPARAM_ID2) String tplCompId, @QueryParam("filter") String filter) {
		return entityService
				.find(sourceName, TemplateComponent.class, tplCompId,
						ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId))
				.map(tplComp -> List.ofAll(tplComp.getTemplateAttributes()))
				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
	}

	/**
	 * Returns the created {@link TemplateAttributeValue}.
	 * 
	 * @param body The {@link TemplateAttribute} to create.
	 * @return the created {@link TemplateAttribute} as {@link Response}.
	 */
	@POST
	@Produces(MediaType.APPLICATION_JSON)
	@Consumes(MediaType.APPLICATION_JSON)
	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
			@PathParam(REQUESTPARAM_ID2) String tplCompId, MDMEntityResponse body) {
		return entityService
				.create(sourceName, TemplateAttribute.class,
						L(decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName),
								entityService.find(sourceName, TemplateComponent.class, tplCompId,
										ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId))))
				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED)) //
				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
	}

	/**
	 * Updates the {@link TemplateAttribute} with all parameters set in the given
	 * JSON body of the request
	 * 
	 * @param sourceName name of the source (MDM {@link Environment} name)
	 * @param id         the identifier of the {@link TemplateAttribute} to delete.
	 * @param body       the body of the request containing the attributes to update
	 * @return the updated {@link TemplateAttribute}
	 */
	@POST
	@Produces(MediaType.APPLICATION_JSON)
	@Consumes(MediaType.APPLICATION_JSON)
	@Path("/{" + REQUESTPARAM_ID3 + "}")
	public Response patch(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
			@PathParam(REQUESTPARAM_ID2) String tplCompId, @PathParam(REQUESTPARAM_ID3) String id,
			MDMEntityResponse body) {
		return entityService
				.update(sourceName,
						entityService.find(sourceName, TemplateAttribute.class, id,
								ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId, tplCompId)),
						decompose(body::getData).<MDMEntity>getValueAt(0))
				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
	}

	/**
	 * Deletes and returns the deleted {@link TemplateAttribute}.
	 * 
	 * @param id The identifier of the {@link TemplateAttribute} to delete.
	 * @return the deleted {@link TemplateAttribute }s as {@link Response}
	 */
	@DELETE
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/{" + REQUESTPARAM_ID3 + "}")
	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
			@PathParam(REQUESTPARAM_ID2) String tplCompId, @PathParam(REQUESTPARAM_ID3) String id) {
		return entityService
				.delete(sourceName,
						entityService.find(sourceName, TemplateAttribute.class, id,
								ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId, tplCompId)))
				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
	}

	/**
	 * Returns the search attributes for the {@link TemplateAttribute} type.
	 * 
	 * @param sourceName name of the source (MDM {@link Environment} name)
	 * @return the {@link SearchAttribute}s as {@link Response}
	 */
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/searchattributes")
	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
		return ServiceUtils.buildSearchAttributesResponse(sourceName, TemplateAttribute.class, entityService);
	}

	/**
	 * Returns a map of localization for the entity type and the attributes.
	 * 
	 * @param sourceName name of the source (MDM {@link Environment} name)
	 * @return the I18N as {@link Response}
	 */
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/localizations")
	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
		return ServiceUtils.buildLocalizationResponse(sourceName, TemplateAttribute.class, entityService);
	}
}