import { NotificationOptions, NotificationService } from './notification-service';

export interface GotifyConfig {
  url: string;
  token: string;
  enabled: boolean;
}

export class GotifyNotificationService implements NotificationService {
  constructor(private config: GotifyConfig) {}

  async notify(options: NotificationOptions): Promise<void> {
    if (!this.config.enabled) return;

    try {
      const { title, message, priority = 4 } = options;
      const url = new URL('message', this.config.url);
      url.searchParams.set('token', this.config.token);

      const controller = new AbortController();
      const timeoutId = setTimeout(() => controller.abort(), 5000);

      const response = await fetch(url.toString(), {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          title,
          message,
          priority,
        }),
        signal: controller.signal,
      });

      clearTimeout(timeoutId);

      if (!response.ok) {
        const errorText = await response.text();
        console.error('Gotify notification failed:', {
          status: response.status,
          error: errorText,
        });
      }
    } catch (error) {
      console.error('Gotify notification error:', error);
    }
  }
}

export class NoopNotificationService implements NotificationService {
  async notify(): Promise<void> {
    // Do nothing
  }
}
