// Copyright © 2023 Ory Corp
// SPDX-License-Identifier: Apache-2.0

export const email = () => Math.random().toString(36) + "@ory.sh"
export const blockedEmail = () =>
  Math.random().toString(36) + "_blocked" + "@ory.sh"

export const password = () => Math.random().toString(36)

export const assertVerifiableAddress =
  ({ isVerified, email }) =>
  (session) => {
    const { identity } = session
    expect(identity).to.have.property("verifiable_addresses")
    expect(identity.verifiable_addresses).to.have.length(1)

    const address = identity.verifiable_addresses[0]
    expect(address.id).to.not.be.empty
    expect(address.verified).to.equal(isVerified)
    expect(address.value).to.equal(email)

    if (isVerified) {
      expect(address.verified_at).to.not.be.null
    } else {
      expect(address).to.not.have.property("verified_at")
    }
  }

export const assertRecoveryAddress =
  ({ email }) =>
  ({ identity }) => {
    expect(identity).to.have.property("recovery_addresses")
    expect(identity.recovery_addresses).to.have.length(1)

    const address = identity.recovery_addresses[0]
    expect(address.id).to.not.be.empty
    expect(address.value).to.equal(email)
  }

export const parseHtml = (html: string) =>
  new DOMParser().parseFromString(html, "text/html")

export const APP_URL = (
  Cypress.env("app_url") || "http://localhost:4455"
).replace(/\/$/, "")

export const MOBILE_URL = (
  Cypress.env("mobile_url") || "http://localhost:19006"
).replace(/\/$/, "")
export const SPA_URL = (
  Cypress.env("react_url") || "http://localhost:4455"
).replace(/\/$/, "")
export const KRATOS_ADMIN = (
  Cypress.env("kratos_admin") || "http://localhost:4434"
)
  .replace()
  .replace(/\/$/, "")

export const KRATOS_PUBLIC = (
  Cypress.env("kratos_public") || "http://localhost:4433"
)
  .replace()
  .replace(/\/$/, "")

export const MAIL_API = (
  Cypress.env("mail_url") || "http://localhost:4437"
).replace(/\/$/, "")

export const website = "https://www.ory.sh/"

export const gen = {
  email,
  blockedEmail,
  password,
  identity: () => ({ email: email(), password: password() }),
  identityWithWebsite: () => ({
    email: email(),
    password: password(),
    fields: { "traits.website": "https://www.ory.sh" },
  }),
}

// Format is
export const verifyHrefPattern =
  /^http:.*\/self-service\/verification\?(((&|)code|(&|)token|(&|)flow)=([\-a-zA-Z0-9]+)){2}$/

// intervals define how long to wait for something,
export const pollInterval = 250 // how long to wait before retry

// Adding 1+ second on top because MySQL doesn't do millisecs.
export const verifyLifespan = 5000 + 1000
export const privilegedLifespan = 5000 + 1000

export const appPrefix = (app) => `[data-testid="app-${app}"] `

export const codeRegex = /(\d{6})/

export function extractOTPCode(body: string): string | null {
  const result = codeRegex.exec(body)
  if (result != null && result.length > 0) {
    return result[0]
  }
  return null
}
