package com.sonymusic.dx.dxuiservice.usm.api;

import feign.Headers;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * Session validation client.
 */
@FeignClient(name = "usmApiClient", url = "${usm.client.url}")
public interface USMApiClient {

    /**
     * Searches users with provided query.
     *
     * @param query Search query.
     * @param auth  Basic auth.
     * @return Search result.
     */
    @PostMapping(
            path = "${usm.api.path}",
            consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    @Headers("Authorization: Basic {auth}")
    UserSearchResponse searchUsers(@RequestParam("search_text") String query,
                                   @RequestHeader("Authorization") String auth);

    /**
     * User save request.
     */
    @Getter
    @Setter
    @Accessors(chain = true)
    class SaveRequestData {
        @feign.form.FormProperty("email")
        public String email;
        @feign.form.FormProperty("firstName")
        public String firstName;
        @feign.form.FormProperty("lastName")
        public String lastName;
        @feign.form.FormProperty("jobTitle")
        public String jobTitle;
        @feign.form.FormProperty("department")
        public String department;
        @feign.form.FormProperty("companyName")
        public String companyName;
        @feign.form.FormProperty("officeLocation")
        public String officeLocation;
        @feign.form.FormProperty("streetAddress")
        public String streetAddress;
        @feign.form.FormProperty("client_admin_user_email")
        public String adminEmail;
        @feign.form.FormProperty("send_welcome_email")
        public boolean sendWelcomeEmail;
    }

    /**
     * Save user.
     *
     * @param data Request data.
     * @param auth Authorization header.
     * @return User lookup response.
     */
    @PostMapping(
            path = "ws/client/user/save",
            consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    @Headers("Authorization: Basic {auth}")
    UserLookUpResponse saveUser(@RequestBody SaveRequestData data,
                                @RequestHeader("Authorization") String auth);

    /**
     * User lookup request.
     */
    @Getter
    @Setter
    @Accessors(chain = true)
    class LookupRequestData {
        @feign.form.FormProperty("email")
        public String email;
    }

    /**
     * Lookup use with provided email.
     *
     * @param data Provided email.
     * @param auth Basic auth.
     * @return Search result.
     */
    @PostMapping(
            path = "ws/client/user/lookup",
            consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    @Headers("Authorization: Basic {auth}")
    UserLookUpResponse lookupUser(@RequestBody LookupRequestData data,
                                  @RequestHeader("Authorization") String auth);
}
