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

import com.airlock.iam.authentication.api.domain.model.idpropagation.ResponseAdder;
import com.airlock.iam.authentication.application.configuration.idpropagation.CookieTicketAdderConfig;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.log.api.signing.SigningLogger;
import com.airlock.iam.plugin.api.config.LogTypes;
import jakarta.inject.Inject;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;

@LogicForConfig(CookieTicketAdderConfig.class)
public final class CookieTicketAdder implements ResponseAdder {
   private static final ELogger LOG = ELoggerFactory.getLogger(CookieTicketAdder.class);
   private final CookieTicketAdderConfig config;
   private final HttpServletResponse response;
   private final SigningLogger signingLogger;

   @Inject
   public CookieTicketAdder(CookieTicketAdderConfig config, HttpServletResponse response, SigningLogger signingLogger) {
      this.config = config;
      this.response = response;
      this.signingLogger = signingLogger;
   }

   @Override
   public void addToResponse(String content) {
      if (content != null && content.contains(";")) {
         LOG.warn(
            LogTypes.CONFIGURATION_ERROR,
            "Writing a cookie containing the reserved character ';' - this may lead to incorrectly stored cookies. Please encode the value first."
         );
      }

      Cookie cookie = new Cookie(this.config.getCookieName(), content);
      if (StringUtils.isNotBlank(this.config.getCookiePath())) {
         cookie.setPath(this.config.getCookiePath());
      }

      if (StringUtils.isNotBlank(this.config.getCookieDomain())) {
         cookie.setDomain(this.config.getCookieDomain());
      }

      cookie.setSecure(this.config.isSecureFlag());
      this.response.addCookie(cookie);
      this.signingLogger.log("Added ticket cookie with name " + LogUtil.quote(this.config.getCookieName()) + " to response");
   }
}
