/*
 * 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 com.epam.dlab.backendapi.resources;

import com.epam.dlab.auth.UserInfo;
import com.epam.dlab.backendapi.domain.EndpointDTO;
import com.epam.dlab.backendapi.domain.EndpointResourcesDTO;
import com.epam.dlab.backendapi.service.EndpointService;
import com.epam.dlab.rest.dto.ErrorDTO;
import com.google.inject.Inject;
import io.dropwizard.auth.Auth;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.headers.Header;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;

import javax.annotation.security.RolesAllowed;
import javax.validation.Valid;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import java.net.URI;

@Path("endpoint")
@RolesAllowed("/api/endpoint")
public class EndpointResource {

	private final EndpointService endpointService;
	@Context
	private UriInfo uriInfo;

	@Inject
	public EndpointResource(EndpointService endpointService) {
		this.endpointService = endpointService;
	}

	@Operation(summary = "Create endpoint", tags = "endpoint")
	@ApiResponses({
			@ApiResponse(responseCode = "201", description = "Endpoint is successfully created",
					headers =
					@Header(required = true, name = "Location", description = "URI of created endpoint resource",
							schema = @Schema(type = "string"))),
			@ApiResponse(responseCode = "400", description = "Validation error", content = @Content(mediaType =
					MediaType.APPLICATION_JSON,
					schema = @Schema(implementation = ErrorDTO.class))),
			@ApiResponse(responseCode = "409", description = "Endpoint with passed name already exist in system",
					content = @Content(mediaType = MediaType.APPLICATION_JSON,
							schema = @Schema(implementation = ErrorDTO.class)))
	})
	@Consumes(MediaType.APPLICATION_JSON)
	@POST
	public Response createEndpoint(@Parameter(hidden = true) @Auth UserInfo userInfo, @Valid EndpointDTO endpointDTO) {
		endpointService.create(userInfo, endpointDTO);
		final URI uri = uriInfo.getRequestUriBuilder().path(endpointDTO.getName()).build();
		return Response
				.ok()
				.location(uri)
				.build();
	}

	@Operation(summary = "Get endpoint info", tags = "endpoint")
	@ApiResponses({
			@ApiResponse(responseCode = "200", description = "Return information about endpoint",
					content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
					@Schema(implementation = EndpointDTO.class))),
			@ApiResponse(responseCode = "404", description = "Endpoint with passed name not found",
					content = @Content(mediaType = MediaType.APPLICATION_JSON,
							schema = @Schema(implementation = ErrorDTO.class)))
	})
	@GET
	@Path("{name}")
	@Produces(MediaType.APPLICATION_JSON)
	public Response getEndpoint(@Parameter(hidden = true) @Auth UserInfo userInfo,
								@Parameter(description = "Endpoint name")
								@PathParam("name") String name) {
		return Response.ok(endpointService.get(name)).build();
	}

	@Operation(summary = "Get endpoints available in system", tags = "endpoint")
	@ApiResponses({
			@ApiResponse(responseCode = "200", description = "Return information about endpoints",
					content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
					@Schema(implementation = EndpointDTO.class)))
	})
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	public Response getEndpoints(@Parameter(hidden = true) @Auth UserInfo userInfo) {
		return Response.ok(endpointService.getEndpoints()).build();
	}

	@Operation(summary = "Get resources related to the endpoint", tags = "endpoint")
	@ApiResponses({
			@ApiResponse(responseCode = "200", description = "Return information about resources of endpoint",
					content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
					@Schema(implementation = EndpointResourcesDTO.class)))
	})
	@GET
	@Path("{name}/resources")
	@Produces(MediaType.APPLICATION_JSON)
	public Response getEndpointResources(@Parameter(hidden = true) @Auth UserInfo userInfo,
										 @Parameter(description = "Endpoint name")
										 @PathParam("name") String name) {
		return Response.ok(endpointService.getEndpointResources(name)).build();
	}

	@Operation(summary = "Remove endpoint", tags = "endpoint")
	@ApiResponses({
			@ApiResponse(responseCode = "200", description = "Endpoint is successfully removed"),
			@ApiResponse(responseCode = "404", description = "Endpoint with passed name not found",
					content = @Content(mediaType = MediaType.APPLICATION_JSON,
							schema = @Schema(implementation = ErrorDTO.class)))
	})
	@DELETE
	@Path("{name}")
	public Response removeEndpoint(@Parameter(hidden = true) @Auth UserInfo userInfo,
								   @Parameter(description = "Endpoint name")
								   @PathParam("name") String name,
								   @Parameter(description = "Delete endpoint only or with related resources")
								   @QueryParam("with-resources") @DefaultValue("false") boolean withResources) {
		endpointService.remove(userInfo, name, withResources);
		return Response.ok().build();
	}

	@Operation(summary = "Check whether endpoint url is valid", tags = "endpoint")
	@ApiResponses({
			@ApiResponse(responseCode = "200", description = "Valid endpoint url"),
			@ApiResponse(responseCode = "404", description = "Endpoint url is not valid"),
	})
	@GET
	@Path("url/{url}")
	@Produces(MediaType.APPLICATION_JSON)
	public Response checkEndpointUrl(@Parameter(hidden = true) @Auth UserInfo userInfo,
									 @Parameter(description = "Endpoint url")
									 @PathParam("url") String url) {
		endpointService.checkUrl(userInfo, url);
		return Response.ok().build();
	}
}
