import axios from "axios";
import NextAuth, { NextAuthOptions } from "next-auth";
import { JWT } from "next-auth/jwt";
import CredentialsProvider from "next-auth/providers/credentials";

interface IToken {
  access: string;
}

const refreshToken = async (token: JWT): Promise<JWT> => {
  const data = {
    refresh: token.refresh_token,
  };

  const response = await axios.post<IToken>(
    "https://api.kgroaduat.fishrungames.com/api/v1/token/refresh/",
    data
  );

  return {
    ...token,
    access_token: response.data.access,
  };
};

export const authOptions: NextAuthOptions = {
  providers: [
    CredentialsProvider({
      name: "Credentials",
      credentials: {
        email: {
          label: "Email",
          type: "text",
          placeholder: "jsmith@example.com",
        },
        password: { label: "Password", type: "password" },
      },
      async authorize(credentials, req) {
        if (!credentials?.email || !credentials?.password)
          return null;
        const { email, password } = credentials as any;

        const res = await fetch(
          "https://api.kgroaduat.fishrungames.com/api/v1/users/login/",
          {
            method: "POST",
            headers: {
              "Content-Type": "application/json",
            },
            body: JSON.stringify({
              email,
              password,
            }),
          }
        );

        if (res.status === 401) {
          console.log(res.status);
          return null;
        }

        const user = await res.json();
        return user;
      },
    }),
  ],
  pages: {
    signIn: "/sign-in",
  },
  session: {
    strategy: "jwt",
  },
  callbacks: {
    async jwt({ token, user }) {
      if (user) return { ...token, ...user };

      return refreshToken(token);
    },

    async session({ token, session }) {
      session.access_token = token.access_token;
      session.refresh_token = token.refresh_token;

      return session;
    },
  },
};

const handler = NextAuth(authOptions);

export { handler as GET, handler as POST };
