import { login, confirm, forgotPassword, resetPassword, TideClientConfig, MemberInfo } from '@qite/tide-client';
import { MemberConfirmationRequest, MemberForgotPasswordRequest, MemberLoginRequest, MemberResetPasswordRequest } from '@qite/tide-client';
import { JwtPayload, jwtDecode } from 'jwt-decode';

interface MemberInfoPayload extends JwtPayload {
  company: string;
  companyName: string;
  language: string;
  member: string;
  email: string;
  unique_name: string;
  addressId: string;
  addressName: string;
  addressLogo: string;
  'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid': string;
  'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name': string;
  'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress': string;
}

export const loginMember = async (username: string, password: string, tideClientConfig: TideClientConfig, portalId: number) => {
  if (!tideClientConfig.host || !tideClientConfig.apiKey) {
    return Promise.reject();
  }

  const memberLogingRequest: MemberLoginRequest = {
    username: username,
    password: password,
    portalId: portalId
  };

  const memberInfo = await login(tideClientConfig, memberLogingRequest, undefined);
  return memberInfo;
};

export const confirmMember = async (token: string, password: string, hasAgreed: boolean, tideClientConfig: TideClientConfig) => {
  if (!tideClientConfig.host || !tideClientConfig.apiKey) {
    return Promise.reject();
  }

  const memberConfirmationRequest: MemberConfirmationRequest = {
    token: token,
    password: password,
    hasAgreed: hasAgreed
  };

  const response = await confirm(tideClientConfig, memberConfirmationRequest, undefined);
  return response;
};

export const passwordForgotten = async (username: string, tideClientConfig: TideClientConfig, portalId: number) => {
  if (!tideClientConfig.host || !tideClientConfig.apiKey) {
    return Promise.reject();
  }

  const memberForgotPasswordRequest: MemberForgotPasswordRequest = {
    username: username,
    portalId: portalId
  };

  const response = await forgotPassword(tideClientConfig, memberForgotPasswordRequest, undefined);
  return response.ok;
};

export const newPassword = async (token: string, password: string, tideClientConfig: TideClientConfig) => {
  if (!tideClientConfig.host || !tideClientConfig.apiKey) {
    return Promise.reject();
  }

  const memberResetPasswordRequest: MemberResetPasswordRequest = {
    token: token,
    password: password
  };

  const response = await resetPassword(tideClientConfig, memberResetPasswordRequest, undefined);
  return response.ok;
};

export const decodeTokenToMemberInfo = (token: string | null): MemberInfo | undefined => {
  if (!token) {
    return undefined;
  }

  const decodedToken = jwtDecode<MemberInfoPayload>(token);
  let member: MemberInfo | undefined = undefined;
  // check if token is not expired
  if (decodedToken?.exp && decodedToken.exp * 1000 < new Date().getTime()) {
    return undefined;
  }

  if (decodedToken) {
    member = {
      id: decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid']
        ? parseInt(decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid'])
        : 0,
      companyId: decodedToken.company ? parseInt(decodedToken.company) : 0,
      companyName: decodedToken.companyName,
      name: decodedToken.unique_name,
      email: decodedToken.email || decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'],
      language: decodedToken.language,
      agentId: decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid']
        ? parseInt(decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid'])
        : 0,
      addressId: decodedToken.addressId ? parseInt(decodedToken.addressId) : undefined,
      addressName: decodedToken.addressName,
      addressLogo: decodedToken.addressLogo
    } as MemberInfo;
  }
  return member;
};
