import { Capacitor } from '@capacitor/core'; import { Device } from '@capacitor/device'; import { getApiBase, apiPostUrlEncoded } from './api.js'; import { ensureUsageTrialInitialized, getUsageTrialDeviceId, setUsageTrialDeviceId, setUsageTrialStart, getUsageTrialState, } from './auth.js'; function isNativePlatform() { return typeof Capacitor?.isNativePlatform === 'function' && Capacitor.isNativePlatform(); } export async function getStableDeviceIdentity() { ensureUsageTrialInitialized(); const cachedDeviceId = getUsageTrialDeviceId(); if (cachedDeviceId) { return { deviceId: cachedDeviceId, platform: isNativePlatform() ? 'android' : 'web', model: '', fingerprint: '', }; } let deviceId = ''; let platform = isNativePlatform() ? 'android' : 'web'; let model = ''; let fingerprint = ''; if (isNativePlatform()) { try { const [idInfo, deviceInfo] = await Promise.all([Device.getId(), Device.getInfo()]); deviceId = String(idInfo?.identifier || '').trim(); platform = String(deviceInfo?.platform || platform).trim() || platform; model = String(deviceInfo?.model || '').trim(); fingerprint = [ platform, String(deviceInfo?.manufacturer || '').trim(), model, String(deviceInfo?.operatingSystem || '').trim(), String(deviceInfo?.osVersion || '').trim(), String(deviceInfo?.name || '').trim(), ] .filter(Boolean) .join('||') .toLowerCase(); } catch { deviceId = ''; } } if (!deviceId) { deviceId = getUsageTrialState().installationId; } setUsageTrialDeviceId(deviceId); return { deviceId, platform, model, fingerprint }; } export async function syncUsageTrialWithServer() { const apiBase = getApiBase(); if (!apiBase) { return getUsageTrialState(); } const identity = await getStableDeviceIdentity(); if (!identity.deviceId) { return getUsageTrialState(); } try { const res = await apiPostUrlEncoded('/api/mobile/trial/state', { device_id: identity.deviceId, device_fingerprint: identity.fingerprint, platform: identity.platform, model: identity.model, }); if (res?.ok && res?.trial?.started_at_ms) { setUsageTrialDeviceId(identity.deviceId); setUsageTrialStart(res.trial.started_at_ms); } } catch { // hors ligne ou backend indisponible : fallback local } return getUsageTrialState(); }