/**
 * next-auth.config.js Example
 *
 * Environment variables for this example:
 *
 * PORT=3000
 * SERVER_URL=http://localhost:3000
 * MONGO_URI=mongodb://localhost:27017/my-database
 *
 * If you wish, you can put these in a `.env` to seperate your environment 
 * specific configuration from your code.
 **/

// Load environment variables from a .env file if one exists
require('dotenv').load()

const nextAuthProviders = require('./next-auth.providers')
const nextAuthFunctions = require('./next-auth.functions')

// If we want to pass a custom session store then we also need to pass an 
// instance of Express Session along with it.
const expressSession = require('express-session')
const MongoStore = require('connect-mongo')(expressSession)

// If no store set, NextAuth defaults to using Express Sessions in-memory
// session store (the fallback is intended as fallback for testing only).
let sessionStore 
if (process.env.MONGO_URI) { 
  sessionStore = new MongoStore({
     url: process.env.MONGO_URI,
     autoRemove: 'interval',
     autoRemoveInterval: 10, // Removes expired sessions every 10 minutes
     collection: 'sessions',
     stringify: false
  })
}  

module.exports = () => {
  // We connect to the User DB before we define our functions. 
  // next-auth.functions.js returns an async method that does that and returns 
  // an object with the functions needed for authentication.
  return nextAuthFunctions()
  .then(functions => {
    return new Promise((resolve, reject) => {    
      // This is the config block we return, ready to be passed to NextAuth
      resolve({
        // Define a port (if none passed, will not start Express)
       // port: process.env.PORT || 3000,
        // Secret used to encrypt session data on the server.
        sessionSecret: 'fkjpeozr',
        // Maximum Session Age in ms (optional, default is 7 days).
        // The expiry time for a session is reset every time a user revisits 
        // the site or revalidates their session token. This is the maximum 
        // idle time value.
        sessionMaxAge: 60000 * 60 * 24 * 7,
        // Session Revalidation in X ms (optional, default is 60 seconds).
        // Specifies how often a Single Page App should revalidate a session.
        // Does not impact the session life on the server, but causes clients 
        // to refetch session info (even if it is in a local cache) after N 
        // seconds has elapsed since it was last checked so they always display 
        // state correctly.
        // If set to 0 will revalidate a session before rendering every page.
        sessionRevalidateAge: 60000,
        // Canonical URL of the server (optiona, but recommended).
        // e.g. 'http://localhost:3000' or 'https://www.example.com' 
        // Used in callbak URLs and email sign in links. It will be auto 
        // generated if not specified, which may cause problems if your site 
        // uses multiple aliases (e.g. 'example.com and 'www.examples.com').
        serverUrl: process.env.SERVER_URL || null,
        // Add an Express Session store.
        expressSession: expressSession,
        sessionStore: sessionStore,
        // Define oAuth Providers
        providers: nextAuthProviders(),
        // Define functions for manging users and sending email.
        functions: functions,
        sessionResave : true
      })
    })
  })
}