import { Injectable, ServiceUnavailableException } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { AppConfig } from '@/config/configs';
import { MailService } from '../mail/mail.service';
import { SendTestInviteDto, SendUpdateInvitationDto } from './invites.dto';

@Injectable()
export class InvitesService {
  constructor(
    private readonly configService: ConfigService<AppConfig, true>,
    private readonly mailService: MailService,
  ) {}

  private downloadLink(): string {
    const link = this.configService.get('invite.androidTestUrl', { infer: true });
    if (!link) {
      throw new ServiceUnavailableException(
        'Android test invite URL is not configured (ANDROID_TEST_INVITE_URL).',
      );
    }
    return link;
  }

  async sendAndroidTestInvite({ email }: SendTestInviteDto) {
    const downloadLink = this.downloadLink();
    const name = MailService.nameFromEmail(email);
    await this.mailService.sendAndroidInviteEmail(email, name, downloadLink);
    return { status: true, message: `Test invite sent to ${email}.` };
  }

  async sendUpdateInvitation({ emails, version, build_number }: SendUpdateInvitationDto) {
    const downloadLink = this.downloadLink();
    const buildNumber = String(build_number);

    const results = await Promise.allSettled(
      emails.map((email) =>
        this.mailService.sendAppUpdateEmail(
          email,
          MailService.nameFromEmail(email),
          version,
          buildNumber,
          downloadLink,
        ),
      ),
    );

    const summary = results.map((r) =>
      r.status === 'fulfilled'
        ? r.value
        : { email: 'unknown', status: 'failed' as const, error: String(r.reason) },
    );

    const sent = summary.filter((r) => r.status === 'sent').length;
    const failed = summary.filter((r) => r.status === 'failed').length;

    return {
      status: true,
      message: `Update invitation sent: ${sent} succeeded, ${failed} failed.`,
      version,
      build_number: buildNumber,
      results: summary,
    };
  }
}
