import { resfreshTokenAction } from '@/feactures/auth/actions/refresh-token-action';
import { auth } from '@/lib/auth';
import { cookies } from 'next/headers';
import { cache } from 'react';

export const getValidAccessToken = cache(async () => {
  const session = await auth();

  if (!session?.access_token) {
    // console.log('No hay Access Token');
    return null
  }
  // console.log('Si hay Access Token');


  const now = Math.floor(Date.now() / 1000);
  // Restamos 10s para tener margen de seguridad
  const isValid = (session.access_expire_in as number) - 10 > now;

  // A. Si es válido, lo retornamos directo
  if (isValid) return session.access_token;
  // console.log('Access Token Expiró');

  // B. Si expiró, buscamos la cookie
  const cookieStore = cookies();
  const cookie = await cookieStore
  const refreshToken = cookie.get('refresh_token')?.value;
  const teaToken = cookie.get('tea_token')?.value;

  if (!refreshToken) {
    // console.log('No hay Refresh Token');
    // Si no hay refres pero si access token pero ya expiro borrar la cookie para forzar cierre de session
    (await cookieStore).delete('authjs.session-token');// comentar si por algun motivo da error
    return null
  } // No hay refresh token, fin del juego
  // console.log('Si hay Refresh Token');

  if (teaToken) {
    return teaToken
  }

  // C. Intentamos refrescar
  const newTokens = await resfreshTokenAction({ refreshToken });

  if (!newTokens) {
    // console.log('No hay token nuevo');
    // Si falla el refresh (token revocado o expirado), borramos cookies
    (await cookieStore).delete('refresh_token');
    (await cookieStore).delete('authjs.session-token');// comentar si por algun motivo da error
    return null;
  }
  // console.log('Si hay token nuevo');

  // console.log('Guardamos refresh');
  // D. Guardamos el nuevo refresh token en cookie y retornamos el access token
  (await cookieStore).set('refresh_token', newTokens.refresh_token, {
    httpOnly: true,
    secure: process.env.NODE_ENV === 'production',
    sameSite: 'lax',
    path: '/',
    maxAge: 7 * 24 * 60 * 60,
  });

  // console.log('guardamo tea');
  (await cookieStore).set('tea_token', newTokens.access_token, {
    httpOnly: true,
    secure: process.env.NODE_ENV === 'production',
    sameSite: 'lax',
    path: '/',
    maxAge: 7 * 24 * 60 * 60,
  });

  return newTokens.access_token;
});
