import { api } from '@sgse-app/backend/convex/_generated/api';
import type { ConvexClient } from 'convex/browser';

/**
 * Obtém tempo do servidor (sincronizado)
 */
export async function obterTempoServidor(client: ConvexClient): Promise<number> {
	try {
		// Tentar obter configuração e sincronizar se necessário
		const config = await client.query(api.configuracaoRelogio.obterConfiguracao, {});

		if (config.usarServidorExterno) {
			try {
				const resultado = await client.action(api.configuracaoRelogio.sincronizarTempo, {});
				if (resultado.sucesso && resultado.timestamp) {
					return resultado.timestamp;
				}
			} catch (error) {
				console.warn('Erro ao sincronizar com servidor externo:', error);
				if (config.fallbackParaPC) {
					return Date.now();
				}
				throw error;
			}
		}

		// Usar tempo do servidor Convex
		const tempoServidor = await client.query(api.configuracaoRelogio.obterTempoServidor, {});
		return tempoServidor.timestamp;
	} catch (error) {
		console.warn('Erro ao obter tempo do servidor, usando tempo local:', error);
		return Date.now();
	}
}

/**
 * Obtém tempo do PC (fallback)
 */
export function obterTempoPC(): number {
	return Date.now();
}

/**
 * Calcula offset entre dois timestamps
 */
export function calcularOffset(timestampServidor: number, timestampLocal: number): number {
	return timestampServidor - timestampLocal;
}

/**
 * Aplica offset a um timestamp
 */
export function aplicarOffset(timestamp: number, offsetSegundos: number): number {
	return timestamp + offsetSegundos * 1000;
}

