import { Profile } from 'passport'
import { logger } from '../../logger'
import { User } from '../../models'

export function passportGeneralCallback (
  accessToken: string,
  refreshToken: string,
  profile: Profile,
  done: (err?: Error | null, user?: User) => void
): void {
  const stringifiedProfile = JSON.stringify(profile)
  User.findOrCreate({
    where: {
      profileid: profile.id.toString()
    },
    defaults: {
      profile: stringifiedProfile,
      accessToken: accessToken,
      refreshToken: refreshToken
    }
  }).then(function ([user, _]) {
    if (user) {
      let needSave = false
      if (user.profile !== stringifiedProfile) {
        user.profile = stringifiedProfile
        needSave = true
      }
      if (user.accessToken !== accessToken) {
        user.accessToken = accessToken
        needSave = true
      }
      if (user.refreshToken !== refreshToken) {
        user.refreshToken = refreshToken
        needSave = true
      }
      if (needSave) {
        user.save().then(function () {
          logger.debug(`user login: ${user.id}`)
          return done(null, user)
        })
      } else {
        logger.debug(`user login: ${user.id}`)
        return done(null, user)
      }
    }
  }).catch(function (err) {
    logger.error('auth callback failed: ' + err)
    return done(err, undefined)
  })
}

export enum ProviderEnum {
  facebook = 'facebook',
  twitter = 'twitter',
  github = 'github',
  gitlab = 'gitlab',
  dropbox = 'dropbox',
  google = 'google',
  ldap = 'ldap',
  oauth2 = 'oauth2',
  saml = 'saml',
}

export type PassportProfile = {
  id: string;
  username: string;
  displayName: string;
  emails: string[];
  avatarUrl: string;
  profileUrl: string;
  provider: ProviderEnum;
  photos: { value: string }[];
}