import dotenv from 'dotenv';
import passport from 'passport';
import GoogleStrategy from 'passport-google-oidc';
import { UserRole } from '../types/serverTypes.js';
import { convertUrlParamsToAppPath } from '../utils/urlParamPassthrough.js';
import runRegistrationAuthProvider, { runLoginAuthProvider } from './runAuthProvider.js';
import { newAccountsDisabled } from './newAccountsDisabled.js';
dotenv.config();

const landingUri = process.env.LANDING_URI || 'http://localhost:3000';

// Refer to the auth/README.md for more details on how this works
export default (app, failureRedirect, successRedirect) => {
  const GOOGLE_CLIENT_ID = process.env.GOOGLE_CLIENT_ID;
  const GOOGLE_CLIENT_SECRET = process.env.GOOGLE_CLIENT_SECRET;
  const GOOGLE_CALLBACK_URL = process.env.SERVER_URI + '/oauth2/redirect/google';

  passport.use(
    'google-signup',
    new GoogleStrategy(
      {
        clientID: GOOGLE_CLIENT_ID,
        clientSecret: GOOGLE_CLIENT_SECRET,
        callbackURL: GOOGLE_CALLBACK_URL,
        scope: ['profile', 'email'],
      },
      async (issuer, profile, done) => {
        return await runRegistrationAuthProvider(issuer, profile, done);
      }
    )
  );

  passport.use(
    'google-login',
    new GoogleStrategy(
      {
        clientID: GOOGLE_CLIENT_ID,
        clientSecret: GOOGLE_CLIENT_SECRET,
        callbackURL: GOOGLE_CALLBACK_URL,
        scope: ['profile', 'email'],
      },
      async (issuer, profile, done) => {
        return await runLoginAuthProvider(issuer, profile, done);
      }
    )
  );

  app.get(
    '/auth/google',
    (req, res, next) => {
      const projectId = req.query.project_id;
      req.session.failure_redirect = null;
      if (projectId) {
        req.session.login_redirect = convertUrlParamsToAppPath(successRedirect, { projectId });
      }
      const duration = req.query.duration;
      const backToLanding = req.query.back_to_landing;
      if (!!backToLanding) {
        req.session.login_redirect = `${landingUri}/logged-in`;
        req.session.failure_redirect = `${landingUri}/logged-in`;
      }
      req.session.auth_type = 'login';
      next();
    },
    passport.authenticate('google-login')
  );

  app.get(
    '/auth/google/signup',
    (req, res, next) => {
      if (newAccountsDisabled) {
        return res.status(403).send('Error: New accounts are disabled.');
      }
      const projectId = req.query.project_id;
      req.session.failure_redirect = null;
      if (projectId) {
        req.session.login_redirect = convertUrlParamsToAppPath(successRedirect, { projectId });
      }
      const duration = req.query.duration;
      const backToLanding = req.query.back_to_landing;
      if (!!backToLanding) {
        req.session.login_redirect = `${landingUri}/logged-in`;
        req.session.failure_redirect = `${landingUri}/logged-in`;
      }
      req.se;
      req.session.auth_type = 'signup';
      next();
    },
    passport.authenticate('google-signup')
  );

  app.get(
    '/oauth2/redirect/google',
    (req, res, next) => {
      res.locals.login_redirect = req.session.login_redirect;
      res.locals.failure_redirect = req.session.failure_redirect;
      next();
    },
    (req, res, next) => {
      if (req.session.auth_type === 'signup') {
        passport.authenticate('google-signup', { failureRedirect: res.locals.failure_redirect || failureRedirect })(
          req,
          res,
          next
        );
      } else {
        passport.authenticate('google-login', {
          failureRedirect: `${res.locals.failure_redirect || failureRedirect}?notregistered=true`,
        })(req, res, next);
      }
    },
    (req, res) => {
      if (req.isAuthenticated() && req.user.role !== UserRole.Waitlist) {
        const redirectUri = res.locals.login_redirect;
        if (redirectUri) {
          res.redirect(redirectUri);
        } else {
          res.redirect(successRedirect);
        }
      } else {
        res.redirect(res.locals.failure_redirect || failureRedirect);
      }
    }
  );
};
