package eu.dnetlib.is.resources;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.IOUtils;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import eu.dnetlib.data.is.resource.model.SimpleResource;
import eu.dnetlib.is.errors.InformationServiceException;

@RestController
@RequestMapping("/ajax/resources")
public class ResourceAjaxController extends AbstractResourceController {

	@PostMapping("/")
	public SimpleResource newResource(@RequestParam final String name,
		@RequestParam final String type,
		@RequestParam(required = false, defaultValue = "") final String description,
		@RequestParam final String content)
		throws InformationServiceException {

		return service.saveNewResource(name, type, description, content);
	}

	@DeleteMapping("/{resId}")
	public void deleteResource(@PathVariable final String resId) {
		service.deleteResource(resId);
	}

	@PostMapping("/{resId}/metadata")
	public void saveMetadata(@PathVariable final String resId, @RequestBody final SimpleResource r) throws InformationServiceException {
		service.saveMetadata(resId, r);
	}

	@PostMapping("/{resId}/content")
	public void saveContent(@PathVariable final String resId, @RequestParam final String content) throws InformationServiceException {
		service.saveContent(resId, content);
	}

	@PostMapping(value = "/{resId}/file", consumes = {
		MediaType.TEXT_PLAIN_VALUE, MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE
	})
	public void uploadContent(@PathVariable final String resId, final HttpServletRequest request) throws InformationServiceException {
		try {
			final String content = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8);
			service.saveContent(resId, content);
		} catch (final IOException e) {
			throw new InformationServiceException("Error processing input file", e);
		}
	}

}
