package org.jboss.resteasy.test.resource.param.resource;

import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.Response;

import org.jboss.logging.Logger;
import org.jboss.resteasy.annotations.jaxrs.CookieParam;
import org.jboss.resteasy.annotations.jaxrs.FormParam;
import org.jboss.resteasy.annotations.jaxrs.HeaderParam;
import org.jboss.resteasy.annotations.jaxrs.MatrixParam;
import org.jboss.resteasy.annotations.jaxrs.PathParam;
import org.jboss.resteasy.annotations.jaxrs.QueryParam;

@Path("/custom/values")
public class RESTEasyParamBasicCustomValuesResource {

    protected static final Logger logger = Logger.getLogger(RESTEasyParamBasicCustomValuesResource.class.getName());

    private String cookieParam0Updated;
    @CookieParam("cookieParam1")
    private String cookieParam1Updated;
    private String cookieParam2Updated;

    private String formParam0Updated;
    @FormParam("formParam1")
    private String formParam1Updated;
    private String formParam2Updated;

    private String headerParam0Updated;
    @HeaderParam("headerParam1")
    private String headerParam1Updated;
    private String headerParam2Updated;

    private String matrixParam0Updated;
    @MatrixParam("matrixParam1")
    private String matrixParam1Updated;
    private String matrixParam2Updated;

    private String pathParam0Updated;
    @PathParam("pathParam1")
    private String pathParam1Updated;
    private String pathParam2Updated;

    private String queryParam0Updated;
    @QueryParam("queryParam1")
    private String queryParam1Updated;
    private String queryParam2Updated;

    public RESTEasyParamBasicCustomValuesResource(
            final @CookieParam("cookieParam0") String cookieParam0Updated,
            final @FormParam("formParam0") String formParam0Updated,
            final @HeaderParam("headerParam0") String headerParam0Updated,
            final @MatrixParam("matrixParam0") String matrixParam0Updated,
            final @PathParam("pathParam0") String pathParam0Updated,
            final @QueryParam("queryParam0") String queryParam0Updated) {
        this.cookieParam0Updated = cookieParam0Updated;
        this.formParam0Updated = formParam0Updated;
        this.headerParam0Updated = headerParam0Updated;
        this.matrixParam0Updated = matrixParam0Updated;
        this.pathParam0Updated = pathParam0Updated;
        this.queryParam0Updated = queryParam0Updated;
    }

    public String getCookieParam2Updated() {
        return cookieParam2Updated;
    }

    @CookieParam("cookieParam2")
    public void setCookieParam2Updated(String cookieParam2Updated) {
        this.cookieParam2Updated = cookieParam2Updated;
    }

    public String getFormParam2Updated() {
        return formParam2Updated;
    }

    @FormParam("formParam2")
    public void setFormParam2Updated(String formParam2Updated) {
        this.formParam2Updated = formParam2Updated;
    }

    public String getPathParam2Updated() {
        return pathParam2Updated;
    }

    public String getHeaderParam2Updated() {
        return headerParam2Updated;
    }

    @HeaderParam("headerParam2")
    public void setHeaderParam2Updated(String headerParam2Updated) {
        this.headerParam2Updated = headerParam2Updated;
    }

    public String getMatrixParam2Updated() {
        return matrixParam2Updated;
    }

    @MatrixParam("matrixParam2")
    public void setMatrixParam2Updated(String matrixParam2Updated) {
        this.matrixParam2Updated = matrixParam2Updated;
    }

    @PathParam("pathParam2")
    public void setPathParam2Updated(String pathParam2Updated) {
        this.pathParam2Updated = pathParam2Updated;
    }

    public String getQueryParam2Updated() {
        return queryParam2Updated;
    }

    @QueryParam("queryParam2")
    public void setQueryParam2Updated(String queryParam2Updated) {
        this.queryParam2Updated = queryParam2Updated;
    }

    @POST
    @Path("a/{pathParam0}/{pathParam1}/{pathParam2}/{pathParam3}")
    public Response post(
            @CookieParam("cookieParam3") String cookieParam3Updated,
            @FormParam("formParam3") String formParam3Updated,
            @HeaderParam("headerParam3") String headerParam3Updated,
            @MatrixParam("matrixParam3") String matrixParam3Updated,
            @PathParam("pathParam3") String pathParam3Updated,
            @QueryParam("queryParam3") String queryParam3Updated) {

        StringBuilder details = new StringBuilder();
        details.append("cookieParam0: " + cookieParam0Updated + "\n");
        details.append("cookieParam1: " + cookieParam1Updated + "\n");
        details.append("cookieParam2: " + cookieParam2Updated + "\n");
        details.append("cookieParam3: " + cookieParam3Updated + "\n");

        details.append("formParam0: " + formParam0Updated + "\n");
        details.append("formParam1: " + formParam1Updated + "\n");
        details.append("formParam2: " + formParam2Updated + "\n");
        details.append("formParam3: " + formParam3Updated + "\n");

        details.append("headerParam0: " + headerParam0Updated + "\n");
        details.append("headerParam1: " + headerParam1Updated + "\n");
        details.append("headerParam2: " + headerParam2Updated + "\n");
        details.append("headerParam3: " + headerParam3Updated + "\n");

        details.append("matrixParam0: " + matrixParam0Updated + "\n");
        details.append("matrixParam1: " + matrixParam1Updated + "\n");
        details.append("matrixParam2: " + matrixParam2Updated + "\n");
        details.append("matrixParam3: " + matrixParam3Updated + "\n");

        details.append("pathParam0: " + pathParam0Updated + "\n");
        details.append("pathParam1: " + pathParam1Updated + "\n");
        details.append("pathParam2: " + pathParam2Updated + "\n");
        details.append("pathParam3: " + pathParam3Updated + "\n");

        details.append("queryParam0: " + queryParam0Updated + "\n");
        details.append("queryParam1: " + queryParam1Updated + "\n");
        details.append("queryParam2: " + queryParam2Updated + "\n");
        details.append("queryParam3: " + queryParam3Updated + "\n");

        logger.info(details);

        if (!"cookieParam0".equals(cookieParam0Updated)
                || !"cookieParam1".equals(cookieParam1Updated)
                || !"cookieParam2".equals(cookieParam2Updated)
                || !"cookieParam3".equals(cookieParam3Updated)) {
            logger.error("cookie error");
            return Response.status(Response.Status.BAD_REQUEST).build();
        }

        if (!"formParam0".equals(formParam0Updated)
                || !"formParam1".equals(formParam1Updated)
                || !"formParam2".equals(formParam2Updated)
                || !"formParam3".equals(formParam3Updated)) {
            logger.error("form error");
            return Response.status(Response.Status.BAD_REQUEST).build();
        }

        if (!"headerParam0".equals(headerParam0Updated)
                || !"headerParam1".equals(headerParam1Updated)
                || !"headerParam2".equals(headerParam2Updated)
                || !"headerParam3".equals(headerParam3Updated)) {
            logger.error("header error");
            return Response.status(Response.Status.BAD_REQUEST).build();
        }

        if (!"matrixParam0".equals(matrixParam0Updated)
                || !"matrixParam1".equals(matrixParam1Updated)
                || !"matrixParam2".equals(matrixParam2Updated)
                || !"matrixParam3".equals(matrixParam3Updated)) {
            logger.error("matrix error");
            return Response.status(Response.Status.BAD_REQUEST).build();
        }

        if (!"pathParam0".equals(pathParam0Updated)
                || !"pathParam1".equals(pathParam1Updated)
                || !"pathParam2".equals(pathParam2Updated)
                || !"pathParam3".equals(pathParam3Updated)) {
            logger.error("path error");
            return Response.status(Response.Status.BAD_REQUEST).build();
        }

        if (!"queryParam0".equals(queryParam0Updated)
                || !"queryParam1".equals(queryParam1Updated)
                || !"queryParam2".equals(queryParam2Updated)
                || !"queryParam3".equals(queryParam3Updated)) {
            logger.error("query error");
            return Response.status(Response.Status.BAD_REQUEST).build();
        }

        return Response.ok().build();
    }
}
