import { config } from 'tailchat-server-sdk';
import type { StrategyType } from './types';
import got from 'got';

const clientInfo = {
  id: process.env.IAM_GITHUB_ID,
  secret: process.env.IAM_GITHUB_SECRET,
};

const authorize_uri =
  process.env.IAM_GITHUB_URI_AUTHORIZE ||
  'https://github.com/login/oauth/authorize';
const access_token_uri =
  process.env.IAM_GITHUB_URI_ACCESS_TOKEN ||
  'https://github.com/login/oauth/access_token';
const userinfo_uri =
  process.env.IAM_GITHUB_URI_USERINFO || 'https://api.github.com/user';
const redirect_uri = `${config.apiUrl}/api/plugin:com.msgbyte.iam/github/redirect`;

export const GithubStrategy: StrategyType = {
  name: 'github',
  type: 'oauth',
  icon: '/images/avatar/github-dark.svg',
  checkAvailable: () => !!clientInfo.id && !!clientInfo.secret,
  getUrl: () => {
    return `${authorize_uri}?client_id=${clientInfo.id}&redirect_uri=${redirect_uri}`;
  },
  getUserInfo: async (code) => {
    console.log('[github oauth] authorization code:', code);

    const tokenResponse = await got
      .post(access_token_uri, {
        searchParams: {
          client_id: clientInfo.id,
          client_secret: clientInfo.secret,
          code: code,
        },
        headers: {
          accept: 'application/json',
        },
      })
      .json<{ access_token: string }>();

    const accessToken = tokenResponse.access_token;
    console.log(`[github oauth] access token: ${accessToken}`);

    const result = await got
      .get(userinfo_uri, {
        headers: {
          accept: 'application/json',
          Authorization: `token ${accessToken}`,
        },
      })
      .json<{
        id: number;
        login: string;
        name: string;
        email: string;
        avatar_url: string;
      }>();

    console.log(`[github oauth] user info:`, result);

    return {
      id: String(result.id),
      nickname: result.name ?? result.login,
      username: result.login,
      email: result.email,
      avatar: result.avatar_url,
    };
  },
};