import dotenv from 'dotenv';
import passport from 'passport';
import { Strategy as GitHubStrategy } from 'passport-github2';
import query from '../server-utils/query.js';
import { User } from '../types/serverTypes.js';
dotenv.config();

export default (app, origin) => {
  const GITHUB_CLIENT_ID = process.env.GITHUB_CLIENT_ID;
  const GITHUB_CLIENT_SECRET = process.env.GITHUB_CLIENT_SECRET;
  const GITHUB_CALLBACK_URL = process.env.GITHUB_REDIRECT_URI;

  passport.use(
    new GitHubStrategy(
      {
        clientID: GITHUB_CLIENT_ID,
        clientSecret: GITHUB_CLIENT_SECRET,
        callbackURL: GITHUB_CALLBACK_URL,
      },
      async (accessToken, refreshToken, profile, done) => {
        let result = await query(`SELECT id FROM og_users WHERE github_id = $1`, [profile.id]);
        if (!result.rows.length) {
          result = await query(
            `INSERT INTO og_users (github_id, username, email, company) VALUES ($1, $2, $3, $4) RETURNING id;`,
            [profile.id, profile.username, profile._json.email, profile._json.company]
          );
          if (!result.rows.length) {
            done('Error: Could not create user.');
            return;
          }
        } else {
          query(`UPDATE og_users SET username = $1, email = $2, company = $3 WHERE id = $4`, [
            profile.username,
            profile._json.email,
            profile._json.company,
            result.rows[0].id,
          ]);
        }
        done(null, {
          id: result.rows[0].id,
          username: profile.username,
          avatar: profile.photos[0].value,
        } as User);
      }
    )
  );

  app.get('/auth/github', passport.authenticate('github', { scope: [] }));
  app.get(
    '/auth/github/callback',
    passport.authenticate('github', { failureRedirect: origin, successRedirect: origin })
  );
};
