package com.airlock.iam.authentication.infrastructure.rememberme;

import com.airlock.iam.authentication.domain.model.rememberme.RememberMeCookie;
import com.airlock.iam.authentication.domain.model.rememberme.RememberMeResponse;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.servlet.http.HttpServletResponse;
import java.util.Optional;

public final class RememberMeResponseImpl implements RememberMeResponse {
   private final Provider<HttpServletResponse> response;
   private final Provider<RememberMeCookie.RememberMeCookieBuilder> cookieBuilder;
   private final Provider<Optional<RememberMeCookie.RememberMeCookieBuilder>> jspCookieBuilder;

   @Inject
   public RememberMeResponseImpl(
      Provider<HttpServletResponse> response,
      Provider<RememberMeCookie.RememberMeCookieBuilder> cookieBuilder,
      Provider<Optional<RememberMeCookie.RememberMeCookieBuilder>> jspCookieBuilder
   ) {
      this.response = response;
      this.cookieBuilder = cookieBuilder;
      this.jspCookieBuilder = jspCookieBuilder;
   }

   @Override
   public void deleteRememberMeCookie() {
      this.deleteCookieFromBuilder((RememberMeCookie.RememberMeCookieBuilder)this.cookieBuilder.get());
   }

   @Override
   public void deleteJspRememberMeCookie() {
      if (((Optional)this.jspCookieBuilder.get()).isPresent()) {
         this.deleteCookieFromBuilder((RememberMeCookie.RememberMeCookieBuilder)((Optional)this.jspCookieBuilder.get()).get());
      }
   }

   private void deleteCookieFromBuilder(RememberMeCookie.RememberMeCookieBuilder builder) {
      RememberMeCookie cookie = builder.value("").maxAge(0).build();
      RememberMeCookieHeaderValueFactory.setCookie(cookie, (HttpServletResponse)this.response.get());
   }

   @Override
   public void addRememberMeCookie(RememberMeCookie cookie) {
      RememberMeCookieHeaderValueFactory.setCookie(cookie, (HttpServletResponse)this.response.get());
   }

   @SuppressFBWarnings(justification = "generated code")
   public static RememberMeResponseImpl.RememberMeResponseImplBuilder builder() {
      return new RememberMeResponseImpl.RememberMeResponseImplBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class RememberMeResponseImplBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private Provider<HttpServletResponse> response;
      @SuppressFBWarnings(justification = "generated code")
      private Provider<RememberMeCookie.RememberMeCookieBuilder> cookieBuilder;
      @SuppressFBWarnings(justification = "generated code")
      private Provider<Optional<RememberMeCookie.RememberMeCookieBuilder>> jspCookieBuilder;

      @SuppressFBWarnings(justification = "generated code")
      RememberMeResponseImplBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public RememberMeResponseImpl.RememberMeResponseImplBuilder response(Provider<HttpServletResponse> response) {
         this.response = response;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RememberMeResponseImpl.RememberMeResponseImplBuilder cookieBuilder(Provider<RememberMeCookie.RememberMeCookieBuilder> cookieBuilder) {
         this.cookieBuilder = cookieBuilder;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RememberMeResponseImpl.RememberMeResponseImplBuilder jspCookieBuilder(
         Provider<Optional<RememberMeCookie.RememberMeCookieBuilder>> jspCookieBuilder
      ) {
         this.jspCookieBuilder = jspCookieBuilder;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public RememberMeResponseImpl build() {
         return new RememberMeResponseImpl(this.response, this.cookieBuilder, this.jspCookieBuilder);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "RememberMeResponseImpl.RememberMeResponseImplBuilder(response="
            + this.response
            + ", cookieBuilder="
            + this.cookieBuilder
            + ", jspCookieBuilder="
            + this.jspCookieBuilder
            + ")";
      }
   }
}
