import type { SyncService } from './SyncService.js';
import type { SettingsService } from './SettingsService.js';

/**
 * v0.3.0 Cut E — 자동 주기 sync timer.
 *
 * - start: settings 의 auto enabled + repo URL 모두 갖춰져야 시작
 * - reconfigure: settings 변경 시 stop + start (새 interval 적용)
 * - stop: clearInterval (idempotent)
 *
 * sync 결과는 무시 (interval mode = silent). conflict 발생 시 다음 manual sync /
 * 충돌 UI 진입 시 처리됨 — 사용자가 settings 페이지의 SyncSection 에서 확인 가능.
 */
export class SyncTimer {
  private handle: NodeJS.Timeout | null = null;

  constructor(
    private syncSvc: SyncService,
    private settings: SettingsService
  ) {}

  async start(): Promise<void> {
    if (this.handle !== null) return;  // idempotent
    const enabled = await this.settings.isAutoSyncEnabled();
    if (!enabled) return;
    const url = await this.settings.getSyncRepoUrl();
    if (url === null || url.trim().length === 0) return;
    const intervalMin = await this.settings.getSyncIntervalMin();
    const ms = Math.max(5, intervalMin) * 60 * 1000;
    this.handle = setInterval(() => {
      void this.syncSvc.sync().catch(() => {
        // silent — interval mode 의 실패는 다음 attempt 또는 사용자 manual 호출이 처리
      });
    }, ms);
  }

  stop(): void {
    if (this.handle !== null) {
      clearInterval(this.handle);
      this.handle = null;
    }
  }

  /** settings 변경 시 호출 — 현재 interval stop 후 새 값으로 start. */
  async reconfigure(): Promise<void> {
    this.stop();
    await this.start();
  }
}
