import { KiboCommerceConfig } from './../index'
import { getCookieExpirationDate } from '../../lib/get-cookie-expiration-date'
import { prepareSetCookie } from '../../lib/prepare-set-cookie'
import { setCookies } from '../../lib/set-cookie'
import { NextApiRequest } from 'next'
import getAnonymousShopperToken from './get-anonymous-shopper-token'

const parseCookie = (cookieValue?: any) => {
  return cookieValue 
    ? JSON.parse(Buffer.from(cookieValue, 'base64').toString('ascii')) 
    : null
}
export default class CookieHandler {
  config: KiboCommerceConfig
  request: NextApiRequest
  response: any
  accessToken: any
  constructor(config: any, req: NextApiRequest, res: any) {
    this.config = config
    this.request = req
    this.response = res
    const encodedToken = req.cookies[config.customerCookie]
    const token = parseCookie(encodedToken)
    this.accessToken = token ? token.accessToken : null
  }

  async getAnonymousToken() {
    const response: any = await getAnonymousShopperToken({
      config: this.config,
    })
    let anonymousAccessToken = response?.accessToken
    return {
      response,
      accessToken: anonymousAccessToken,
    }
  }
  isShopperCookieAnonymous() {
    const customerCookieKey = this.config.customerCookie
    const shopperCookie = this.request.cookies[customerCookieKey]
    const shopperSession = parseCookie(shopperCookie);
    const isAnonymous = shopperSession?.customerAccount ? false : true 
    return isAnonymous
  }
  setAnonymousShopperCookie(anonymousShopperTokenResponse: any) {
    const cookieExpirationDate = getCookieExpirationDate(
      this.config.customerCookieMaxAgeInDays
    )

    const authCookie = prepareSetCookie(
      this.config.customerCookie,
      JSON.stringify(anonymousShopperTokenResponse),
      anonymousShopperTokenResponse?.accessTokenExpiration
        ? { expires: cookieExpirationDate }
        : {}
    )
    setCookies(this.response, [authCookie])
  }
  getAccessToken() {
    return this.accessToken
  }
}