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

import com.airlock.iam.authentication.domain.service.newdevice.LoginFromNewDeviceResponse;
import com.airlock.iam.common.api.domain.model.cookie.KnownSameSitePolicy;
import com.airlock.iam.common.domain.model.request.ContextPath;
import com.airlock.iam.common.infrastructure.util.CookieUtil;
import com.airlock.iam.flow.shared.domain.model.newdevice.LoginFromNewDeviceKnownUsers;
import com.airlock.iam.flow.shared.domain.model.newdevice.LoginFromNewDeviceSettings;
import com.airlock.iam.flow.shared.infrastructure.service.newdevice.LoginFromNewDeviceKnownUsersSerializer;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletResponse;

public final class LoginFromNewDeviceResponseImpl implements LoginFromNewDeviceResponse {
   private final Provider<HttpServletResponse> response;
   private final Provider<LoginFromNewDeviceSettings> settings;
   private final Provider<LoginFromNewDeviceKnownUsersSerializer> serializer;
   private final Provider<ContextPath> context;

   @Inject
   public LoginFromNewDeviceResponseImpl(
      Provider<HttpServletResponse> response,
      Provider<LoginFromNewDeviceSettings> settings,
      Provider<LoginFromNewDeviceKnownUsersSerializer> serializer,
      Provider<ContextPath> context
   ) {
      this.response = response;
      this.settings = settings;
      this.serializer = serializer;
      this.context = context;
   }

   @Override
   public void setKnownUsers(LoginFromNewDeviceKnownUsers knownUsers) {
      Cookie cookie = new Cookie(
         ((LoginFromNewDeviceSettings)this.settings.get()).cookieName().name(),
         ((LoginFromNewDeviceKnownUsersSerializer)this.serializer.get()).serialize(knownUsers)
      );
      cookie.setHttpOnly(true);
      cookie.setSecure(true);
      cookie.setMaxAge(Math.toIntExact(((LoginFromNewDeviceSettings)this.settings.get()).validity().duration().toSeconds()));
      cookie.setPath(((ContextPath)this.context.get()).getPath());
      CookieUtil.setCookie((HttpServletResponse)this.response.get(), cookie, KnownSameSitePolicy.LAX);
   }
}
