package org.onehippo.forge.konakart.site.service;

import com.konakart.al.KKAppEng;
import org.hippoecm.hst.core.component.HstComponentException;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface KKCookieService {

  public static final String GUEST_CUSTOMER_ID = "GUEST_CUSTOMER_ID";

  public static final String CUSTOMER_LOCALE = "CUSTOMER_LOCALE";

  public static final String CUSTOMER_NAME = "CUSTOMER_NAME";

  public static final String CUSTOMER_UUID = "CUSTOMER_UUID";

  public static final int COOKIE_MAX_AGE_IN_SECS = 365 * 24 * 60 * 60;


  /**
   * Method used to create a browser cookie when a customer first accesses the application. If the
   * cookie already exists then we retrieve the guest customer id from the cookie which will be
   * used to retrieve and cart items that the customer added to the cart on his last visit.
   *
   * @param request  the http request
   * @param response the http response
   * @return Returns the Customer UUID
   * @throws org.hippoecm.hst.core.component.HstComponentException
   *          .
   */
  String manageCookies(@Nonnull HttpServletRequest request, @Nonnull HttpServletResponse response) throws HstComponentException;

  /**
   * Method used to create a browser cookie when a customer first accesses the application. If the
   * cookie already exists then we retrieve the guest customer id from the cookie which will be
   * used to retrieve and cart items that the customer added to the cart on his last visit.
   *
   * @param request  the http request
   * @param response the http response
   * @return Returns the Customer UUID
   * @throws org.hippoecm.hst.core.component.HstComponentException
   *          .
   */
  @Nullable
  String manageCookies(@Nonnull HttpServletRequest request, @Nonnull HttpServletResponse response,
                       @Nonnull KKAppEng kkAppEng) throws HstComponentException;

  /**
   * Save the customer name in a cookie so that we can greet him when he next accesses the
   * application.
   *
   * @param request  the http request
   * @param response the http response
   * @throws org.hippoecm.hst.core.component.HstComponentException
   *          .
   */
  @Nullable
  void manageCookiesLogin(@Nonnull HttpServletRequest request, @Nonnull HttpServletResponse response) throws HstComponentException;

  /**
   * Save the customer name in a cookie so that we can greet him when he next accesses the
   * application.
   *
   * @param request  the http request
   * @param response the http response
   * @param kkAppEng the Konakart client
   * @throws org.hippoecm.hst.core.component.HstComponentException
   *          .
   */
  void manageCookiesLogin(@Nonnull HttpServletRequest request, @Nonnull HttpServletResponse response,
                          @Nonnull KKAppEng kkAppEng) throws HstComponentException;


  /**
   * When we log out, ensure that the new guest customer that is created has the id saved in the
   * browser cookie.
   *
   * @param request  the http request
   * @param response the http response
   * @throws org.hippoecm.hst.core.component.HstComponentException
   *          .
   */
  void manageCookieLogout(@Nonnull HttpServletRequest request, @Nonnull HttpServletResponse response) throws HstComponentException;

  /**
   * When we log out, ensure that the new guest customer that is created has the id saved in the
   * browser cookie.
   *
   * @param request  the http request
   * @param response the http response
   * @param kkAppEng the Konakart client
   * @throws org.hippoecm.hst.core.component.HstComponentException
   *          .
   */
  void manageCookieLogout(@Nonnull HttpServletRequest request, @Nonnull HttpServletResponse response,
                          @Nonnull KKAppEng kkAppEng) throws HstComponentException;

}
