# frozen_string_literal: true

require_relative 'request_helper'

module StytchB2B
  class Passwords
    include Stytch::RequestHelper
    attr_reader :email, :sessions, :existing_password

    def initialize(connection)
      @connection = connection

      @email = StytchB2B::Passwords::Email.new(@connection)
      @sessions = StytchB2B::Passwords::Sessions.new(@connection)
      @existing_password = StytchB2B::Passwords::ExistingPassword.new(@connection)
    end

    def strength_check(
      password:,
      email_address: nil
    )
      request = {
        password: password
      }
      request[:email_address] = email_address unless email_address.nil?

      post_request('/v1/b2b/passwords/strength_check', request)
    end

    def migrate(
      email_address:,
      hash:,
      hash_type:,
      organization_id:,
      md_5_config: nil,
      argon_2_config: nil,
      sha_1_config: nil,
      scrypt_config: nil,
      name: nil,
      trusted_metadata: nil,
      untrusted_metadata: nil
    )
      request = {
        email_address: email_address,
        hash: hash,
        hash_type: hash_type,
        organization_id: organization_id
      }
      request[:md_5_config] = md_5_config unless md_5_config.nil?
      request[:argon_2_config] = argon_2_config unless argon_2_config.nil?
      request[:sha_1_config] = sha_1_config unless sha_1_config.nil?
      request[:scrypt_config] = scrypt_config unless scrypt_config.nil?
      request[:name] = name unless name.nil?
      request[:trusted_metadata] = trusted_metadata unless trusted_metadata.nil?
      request[:untrusted_metadata] = untrusted_metadata unless untrusted_metadata.nil?

      post_request('/v1/b2b/passwords/migrate', request)
    end

    def authenticate(
      organization_id:,
      email_address:,
      password:,
      session_token: nil,
      session_duration_minutes: nil,
      session_jwt: nil,
      session_custom_claims: nil
    )
      request = {
        organization_id: organization_id,
        email_address: email_address,
        password: password
      }
      request[:session_token] = session_token unless session_token.nil?
      request[:session_duration_minutes] = session_duration_minutes unless session_duration_minutes.nil?
      request[:session_jwt] = session_jwt unless session_jwt.nil?
      request[:session_custom_claims] = session_custom_claims unless session_custom_claims.nil?

      post_request('/v1/b2b/passwords/authenticate', request)
    end

    class Email
      include Stytch::RequestHelper

      def initialize(connection)
        @connection = connection
      end

      def reset_start(
        organization_id:,
        email_address:,
        reset_password_redirect_url: nil,
        reset_password_expiration_minutes: nil,
        code_challenge: nil,
        login_redirect_url: nil,
        locale: nil,
        reset_password_template_id: nil
      )
        request = {
          organization_id: organization_id,
          email_address: email_address
        }
        request[:reset_password_redirect_url] = reset_password_redirect_url unless reset_password_redirect_url.nil?
        unless reset_password_expiration_minutes.nil?
          request[:reset_password_expiration_minutes] =
            reset_password_expiration_minutes
        end
        request[:code_challenge] = code_challenge unless code_challenge.nil?
        request[:login_redirect_url] = login_redirect_url unless login_redirect_url.nil?
        request[:locale] = locale unless locale.nil?
        request[:reset_password_template_id] = reset_password_template_id unless reset_password_template_id.nil?

        post_request('/v1/b2b/passwords/email/reset/start', request)
      end

      def reset(
        password_reset_token:,
        password:,
        session_token: nil,
        session_duration_minutes: nil,
        session_jwt: nil,
        code_verifier: nil,
        session_custom_claims: nil
      )
        request = {
          password_reset_token: password_reset_token,
          password: password
        }
        request[:session_token] = session_token unless session_token.nil?
        request[:session_duration_minutes] = session_duration_minutes unless session_duration_minutes.nil?
        request[:session_jwt] = session_jwt unless session_jwt.nil?
        request[:code_verifier] = code_verifier unless code_verifier.nil?
        request[:session_custom_claims] = session_custom_claims unless session_custom_claims.nil?

        post_request('/v1/b2b/passwords/email/reset', request)
      end
    end

    class Sessions
      include Stytch::RequestHelper

      def initialize(connection)
        @connection = connection
      end

      def reset(
        organization_id:,
        password:,
        session_token: nil,
        session_jwt: nil
      )
        request = {
          organization_id: organization_id,
          password: password
        }
        request[:session_token] = session_token unless session_token.nil?
        request[:session_jwt] = session_jwt unless session_jwt.nil?

        post_request('/v1/b2b/passwords/session/reset', request)
      end
    end

    class ExistingPassword
      include Stytch::RequestHelper

      def initialize(connection)
        @connection = connection
      end

      def reset(
        email_address:,
        existing_password:,
        new_password:,
        organization_id:,
        session_token: nil,
        session_duration_minutes: nil,
        session_jwt: nil,
        session_custom_claims: nil
      )
        request = {
          email_address: email_address,
          existing_password: existing_password,
          new_password: new_password,
          organization_id: organization_id
        }
        request[:session_token] = session_token unless session_token.nil?
        request[:session_duration_minutes] = session_duration_minutes unless session_duration_minutes.nil?
        request[:session_jwt] = session_jwt unless session_jwt.nil?
        request[:session_custom_claims] = session_custom_claims unless session_custom_claims.nil?

        post_request('/v1/b2b/passwords/existing_password/reset', request)
      end
    end
  end
end