import { cache } from 'react'
import * as context from 'next/headers'
import { lucia } from 'lucia'
import { nextjs_future } from 'lucia/middleware'
import { prisma } from '@lucia-auth/adapter-prisma'
import { google } from '@lucia-auth/oauth/providers'
import { prisma as client } from '@/lib/prisma'
import { Facebook, LinkedIn, generateCodeVerifier, generateState } from 'arctic'
import { first } from 'lodash'
// import { google } from './oauth'

export const auth = lucia({
  adapter: prisma(client, {
    user: 'user',
    key: 'key',
    session: 'session',
  }),

  env: process.env.NODE_ENV === 'development' ? 'DEV' : 'PROD',
  middleware: nextjs_future(),
  sessionCookie: { expires: false },
  getUserAttributes: (data) => {
    return (
      {
        email: data.email,
        emailVerified: data.emailVerified,
        isExpert: data.isExpert,
        firstName: data.firstName,
        lastName: data.lastName,
        countryOfResidence: data.countryOfResidence
      }
    )
  },
})

export const createSession = async (uid: string) => {
  const session = await auth.createSession({
    userId: uid,
    attributes: {},
  })

  auth.handleRequest('POST', context).setSession(session)
}

// export const googleAuth = google(auth, {
//   clientId: process.env.GOOGLE_CLIENT_ID as string,
//   clientSecret: process.env.GOOGLE_APP_SECRET as string,
//   redirectUri: process.env.GOOGLE_REDIRECT_URI as string,
//   scope: ['email', 'profile'],
// })

// export const googleAuth = google(auth, {
//   clientId: process.env.GOOGLE_CLIENT_ID as string,
//   clientSecret: process.env.GOOGLE_APP_SECRET as string,
//   redirectUri: process.env.GOOGLE_REDIRECT_URI as string,
//   // Add scopes for Google Calendar
//   scope: [
//     'email',
//     'profile',
//     'https://www.googleapis.com/auth/calendar', // Full access to calendars
//     'https://www.googleapis.com/auth/calendar.events', // Manage calendar events
//   ],
//   accessType: 'offline',
// })

// export const createGoogleAuthorizationURL = async () => {
//   try {
//     const state = generateState();
//     const codeVarifier = generateCodeVerifier()

//     context.cookies().set('codeVerifier', codeVarifier, {
//       httpOnly: true,
//       secure: process.env.NODE_ENV === 'production',
//       sameSite: 'strict'
//     })

//     const authorizationURL = await google.createAuthorizationURL(state, codeVarifier);

//     return {
//       successs: true,
//       data: authorizationURL
//     }
//   } catch (error) {
//     return {
//       error: error?.message
//     }
//   }

//   // const tokens = await google.validateAuthorizationCode(code);
// }

// export const facebookAuth = facebook(auth, {
//   clientId: process.env.FACEBOOK_CLIENT_ID as string,
//   clientSecret: process.env.FACEBOOK_APP_SECRET as string,
//   redirectUri: process.env.FACEBOOK_REDIRECT_URI as string,
//   scope: ['email', 'public_profile'],
// })
export const facebook = new Facebook(
  process.env.FACEBOOK_CLIENT_ID!,
  process.env.FACEBOOK_APP_SECRET!,
  process.env.FACEBOOK_REDIRECT_URI!
)


// export const linkedInAuth = linkedIn(auth, {
//   clientId: process.env.LINKEDIN_CLIENT_ID as string,
//   clientSecret: process.env.LINKEDIN_APP_SECRET as string,
//   redirectUri: process.env.LINKEDIN_REDIRECT_URI as string,
//   scope: ['email', 'profile'],
// })
export const linkedIn = new LinkedIn(
  process.env.LINKEDIN_CLIENT_ID!,
  process.env.LINKEDIN_APP_SECRET!,
  process.env.LINKEDIN_REDIRECT_URI!
)

export const getPageSession = cache(() => {
  const authRequest = auth.handleRequest('GET', context)
  return authRequest.validate()
})
