package register;

import io.netty.handler.codec.http.cookie.ClientCookieDecoder;
import io.netty.handler.codec.http.cookie.Cookie;
import nyu.Term;
import org.asynchttpclient.Request;
import org.asynchttpclient.RequestBuilder;
import org.asynchttpclient.uri.Uri;
import scraping.query.GetClient;

import java.util.List;
import java.util.concurrent.Future;
import java.util.stream.Collectors;

public class Context {
  private final static String ROOT_URI =
      "https://m.albert.nyu.edu/app/student/enrollmentcart/enroll/NYUNV/UGRD";
  public static Future<HttpContext> getContextAsync(Term term) {
    Request request = new RequestBuilder()
                          .setUri(Uri.create(ROOT_URI + term.getId()))
                          .setMethod("GET")
                          .build();

    return GetClient.getClient()
        .executeRequest(request)
        .toCompletableFuture()
        .handleAsync((resp, throwable) -> {
          if (resp == null) {
            return null;
          }

          List<Cookie> cookies =
              resp.getHeaders()
                  .getAll("Set-Cookie")
                  .stream()
                  .map(cookie -> ClientCookieDecoder.STRICT.decode(cookie))
                  .collect(Collectors.toList());
          Cookie csrfCookie =
              cookies.stream()
                  .filter(cookie -> cookie.name().equals("CSRFCookie"))
                  .findAny()
                  .orElse(null);
          if (csrfCookie == null) {
            return null;
          }
          return new HttpContext(csrfCookie.value(), cookies);
        });
  }

  // @Todo: Move this to be a class on its own
  public static class HttpContext {
    final String csrfToken;
    final List<Cookie> cookies;

    HttpContext(String tok, List<Cookie> cookies) {
      this.csrfToken = tok;
      this.cookies = cookies;
    }
  }
}