// Path: allegro-nice-domain/src/main/java/com/apwglobal/nice/exception/RestApiException.java
// public class RestApiException extends AllegroException {
// 
//     public RestApiException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public RestApiException(String message) {
//         super(message);
//     }
// 
// }
// 
// Path: allegro-nice-domain/src/main/java/com/apwglobal/nice/rest/RestApiErrorResult.java
// public class RestApiErrorResult {
// 
//     @SerializedName("error")
//     private String error;
// 
//     @SerializedName("error_description")
//     private String errorDescription;
// 
//     public String getError() {
//         return error;
//     }
// 
//     public String getErrorDescription() {
//         return errorDescription;
//     }
// 
//     @Override
//     public String toString() {
//         return "RestApiErrorResult{" +
//                 "error='" + error + '\'' +
//                 ", errorDescription='" + errorDescription + '\'' +
//                 '}';
//     }
// 
// }
// 
// Path: allegro-nice-domain/src/main/java/com/apwglobal/nice/rest/RestApiSession.java
// public class RestApiSession {
// 
//     @SerializedName("access_token")
//     private String accessToken;
//     @SerializedName("refresh_token")
//     private String refreshRoken;
// 
// 
//     public String getAccessToken() {
//         return accessToken;
//     }
//     public String getRefreshRoken() {
//         return refreshRoken;
//     }
// 
//     @Override
//     public String toString() {
//         return "RestApiSession{" +
//                 "accessToken='" + accessToken + '\'' +
//                 ", refreshRoken='" + refreshRoken + '\'' +
//                 '}';
//     }
// 
// }
// 
// Path: allegro-nice-api/src/main/java/com/apwglobal/nice/util/ClientExecuteUtil.java
// public class ClientExecuteUtil {
// 
//     private final static Logger logger = LoggerFactory.getLogger(ClientExecuteUtil.class);
// 
//     @NotNull
//     public static String execute(@NotNull HttpRequestBase httpRequest) {
//         CloseableHttpClient client = HttpClients.createDefault();
// 
//         try (CloseableHttpResponse res = client.execute(httpRequest)) {
//             HttpEntity entity = res.getEntity();
//             return EntityUtils.toString(entity, "UTF-8");
//         } catch (Exception e) {
//             logger.error(e.getMessage(), e);
//             throw new RestApiException(e.getMessage(), e);
//         }
//     }
// 
// }
// 
// Path: allegro-nice-api/src/main/java/com/apwglobal/nice/util/RestCommandBuilder.java
// public class RestCommandBuilder {
// 
//     private static final String SCHEMA = "https";
//     private static final String HOST = "allegroapi.io";
// 
//     private String schema = SCHEMA;
//     private String host = HOST;
//     private String path;
//     private Map<String, String> params = new HashMap<>();
//     private Map<String, String> headers = new HashMap<>();
//     private String entity;
// 
//     public RestCommandBuilder schema(String val) {
//         schema = val;
//         return this;
//     }
// 
//     public RestCommandBuilder host(String val) {
//         host = val;
//         return this;
//     }
// 
//     public RestCommandBuilder path(String val) {
//         path = val;
//         return this;
//     }
// 
//     public RestCommandBuilder addParam(String key, String val) {
//         params.put(key, val);
//         return this;
//     }
// 
//     public RestCommandBuilder addHeader(String key, String val) {
//         headers.put(key, val);
//         return this;
//     }
// 
//     public RestCommandBuilder entity(String val) {
//         entity = val;
//         return this;
//     }
// 
//     public HttpGet buildGet() {
//         URI uri = buildUri();
//         HttpGet post = new HttpGet(uri);
//         headers.forEach(post::setHeader);
// 
//         return post;
//     }
// 
//     public HttpPost buildPost() {
//         URI uri = buildUri();
//         HttpPost post = new HttpPost(uri);
//         headers.forEach(post::setHeader);
//         setEntity(post);
// 
//         return post;
//     }
// 
//     public HttpPut buildPut() {
//         URI uri = buildUri();
//         HttpPut put = new HttpPut(uri);
//         headers.forEach(put::setHeader);
//         setEntity(put);
//         return put;
//     }
// 
//     private void setEntity(HttpEntityEnclosingRequestBase put) {
//         if (this.entity == null) {
//             return;
//         }
// 
//         try {
//             put.setEntity(new StringEntity(entity));
//         } catch (UnsupportedEncodingException e) {
//             throw new IllegalArgumentException(e);
//         }
//     }
// 
//     private URI buildUri() {
//         URIBuilder uriBuilder = new URIBuilder().setScheme(schema).setHost(host).setPath(path);
//         params.forEach(uriBuilder::setParameter);
// 
//         try {
//             return uriBuilder.build();
//         } catch (URISyntaxException e) {
//             throw new IllegalArgumentException(e.getMessage(), e);
//         }
//     }
// 
// }


import com.apwglobal.nice.exception.RestApiException;
import com.apwglobal.nice.rest.RestApiErrorResult;
import com.apwglobal.nice.rest.RestApiSession;
import com.apwglobal.nice.util.ClientExecuteUtil;
import com.apwglobal.nice.util.RestCommandBuilder;
import com.google.gson.Gson;
import org.apache.http.client.methods.HttpPost;
import org.jetbrains.annotations.NotNull;
import static java.util.Base64.getEncoder;
package com.apwglobal.nice.login;



public class RestLoginService {

    private static final String PATH = "/auth/oauth/token";
    public static final String LOGIN_HOST = "ssl.allegro.pl";
    private final Credentials credentials;

    public RestLoginService(@NotNull Credentials cred) {
        this.credentials = cred;
    }

// Path: allegro-nice-domain/src/main/java/com/apwglobal/nice/exception/RestApiException.java
// public class RestApiException extends AllegroException {
// 
//     public RestApiException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public RestApiException(String message) {
//         super(message);
//     }
// 
// }
// 
// Path: allegro-nice-domain/src/main/java/com/apwglobal/nice/rest/RestApiErrorResult.java
// public class RestApiErrorResult {
// 
//     @SerializedName("error")
//     private String error;
// 
//     @SerializedName("error_description")
//     private String errorDescription;
// 
//     public String getError() {
//         return error;
//     }
// 
//     public String getErrorDescription() {
//         return errorDescription;
//     }
// 
//     @Override
//     public String toString() {
//         return "RestApiErrorResult{" +
//                 "error='" + error + '\'' +
//                 ", errorDescription='" + errorDescription + '\'' +
//                 '}';
//     }
// 
// }
// 
// Path: allegro-nice-domain/src/main/java/com/apwglobal/nice/rest/RestApiSession.java
// public class RestApiSession {
// 
//     @SerializedName("access_token")
//     private String accessToken;
//     @SerializedName("refresh_token")
//     private String refreshRoken;
// 
// 
//     public String getAccessToken() {
//         return accessToken;
//     }
//     public String getRefreshRoken() {
//         return refreshRoken;
//     }
// 
//     @Override
//     public String toString() {
//         return "RestApiSession{" +
//                 "accessToken='" + accessToken + '\'' +
//                 ", refreshRoken='" + refreshRoken + '\'' +
//                 '}';
//     }
// 
// }
// 
// Path: allegro-nice-api/src/main/java/com/apwglobal/nice/util/ClientExecuteUtil.java
// public class ClientExecuteUtil {
// 
//     private final static Logger logger = LoggerFactory.getLogger(ClientExecuteUtil.class);
// 
//     @NotNull
//     public static String execute(@NotNull HttpRequestBase httpRequest) {
//         CloseableHttpClient client = HttpClients.createDefault();
// 
//         try (CloseableHttpResponse res = client.execute(httpRequest)) {
//             HttpEntity entity = res.getEntity();
//             return EntityUtils.toString(entity, "UTF-8");
//         } catch (Exception e) {
//             logger.error(e.getMessage(), e);
//             throw new RestApiException(e.getMessage(), e);
//         }
//     }
// 
// }
// 
// Path: allegro-nice-api/src/main/java/com/apwglobal/nice/util/RestCommandBuilder.java
// public class RestCommandBuilder {
// 
//     private static final String SCHEMA = "https";
//     private static final String HOST = "allegroapi.io";
// 
//     private String schema = SCHEMA;
//     private String host = HOST;
//     private String path;
//     private Map<String, String> params = new HashMap<>();
//     private Map<String, String> headers = new HashMap<>();
//     private String entity;
// 
//     public RestCommandBuilder schema(String val) {
//         schema = val;
//         return this;
//     }
// 
//     public RestCommandBuilder host(String val) {
//         host = val;
//         return this;
//     }
// 
//     public RestCommandBuilder path(String val) {
//         path = val;
//         return this;
//     }
// 
//     public RestCommandBuilder addParam(String key, String val) {
//         params.put(key, val);
//         return this;
//     }
// 
//     public RestCommandBuilder addHeader(String key, String val) {
//         headers.put(key, val);
//         return this;
//     }
// 
//     public RestCommandBuilder entity(String val) {
//         entity = val;
//         return this;
//     }
// 
//     public HttpGet buildGet() {
//         URI uri = buildUri();
//         HttpGet post = new HttpGet(uri);
//         headers.forEach(post::setHeader);
// 
//         return post;
//     }
// 
//     public HttpPost buildPost() {
//         URI uri = buildUri();
//         HttpPost post = new HttpPost(uri);
//         headers.forEach(post::setHeader);
//         setEntity(post);
// 
//         return post;
//     }
// 
//     public HttpPut buildPut() {
//         URI uri = buildUri();
//         HttpPut put = new HttpPut(uri);
//         headers.forEach(put::setHeader);
//         setEntity(put);
//         return put;
//     }
// 
//     private void setEntity(HttpEntityEnclosingRequestBase put) {
//         if (this.entity == null) {
//             return;
//         }
// 
//         try {
//             put.setEntity(new StringEntity(entity));
//         } catch (UnsupportedEncodingException e) {
//             throw new IllegalArgumentException(e);
//         }
//     }
// 
//     private URI buildUri() {
//         URIBuilder uriBuilder = new URIBuilder().setScheme(schema).setHost(host).setPath(path);
//         params.forEach(uriBuilder::setParameter);
// 
//         try {
//             return uriBuilder.build();
//         } catch (URISyntaxException e) {
//             throw new IllegalArgumentException(e.getMessage(), e);
//         }
//     }
// 
// }


// Path: allegro-nice-api/src/main/java/com/apwglobal/nice/login/RestLoginService.java
import com.apwglobal.nice.exception.RestApiException;
import com.apwglobal.nice.rest.RestApiErrorResult;
import com.apwglobal.nice.rest.RestApiSession;
import com.apwglobal.nice.util.ClientExecuteUtil;
import com.apwglobal.nice.util.RestCommandBuilder;
import com.google.gson.Gson;
import org.apache.http.client.methods.HttpPost;
import org.jetbrains.annotations.NotNull;
import static java.util.Base64.getEncoder;

package com.apwglobal.nice.login;



public class RestLoginService {

    private static final String PATH = "/auth/oauth/token";
    public static final String LOGIN_HOST = "ssl.allegro.pl";
    private final Credentials credentials;

    public RestLoginService(@NotNull Credentials cred) {
        this.credentials = cred;
    }

    public RestApiSession login(@NotNull String code) throws RestApiException {