import { RedmineTypes } from '@app/event-emitter/models/redmine-types';
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

@Injectable()
export class RedminePublicUrlConverter {
  private redminePublicUrlPrefix: string;

  constructor(private configService: ConfigService) {
    this.redminePublicUrlPrefix =
      this.configService.get<string>('redmineUrlPublic');
  }

  convert(issueId: number | string): string {
    return `${this.redminePublicUrlPrefix}/issues/${issueId}`;
  }

  getUrl(issueId: number | string): string {
    return this.convert(issueId);
  }

  getHtmlHref(issue: RedmineTypes.Issue): string {
    const url = this.getUrl(issue.id);
    return `<a href="${url}">${issue.tracker.name} #${issue.id}</a>`;
  }

  getMinHtmlHref(issueId: number | string): string {
    const url = this.getUrl(issueId);
    return `<a href="${url}">#${issueId}</a>`;
  }

  /**
   * Обогащение текста с идентификаторами задач html ссылками на эти задачи
   *
   * Например текст `"Эта ошибка будет решена в рамках задач #123 и #456"`
   * будет заменён на `"Эта ошибка будет решена в рамках задач
   * <a href="http://redmine.example.org/issues/123">#123</a> и
   * <a href="http://redmine.example.org/issues/456">#456</a>"`
   *
   * @param text
   * @param linkGenerator функция замены отдельного идентификатора на html ссылку. По умолчанию
   * будет использоваться собственная функция this.getMinHtmlHref
   * @see convert
   */
  enrichTextWithIssues(
    text: string,
    linkGenerator?: (issueId: number | string) => string,
  ): string {
    const generator = linkGenerator
      ? linkGenerator
      : (issueId) => this.getMinHtmlHref(issueId);

    const regexp = /^\d+/;

    const parts = text.split('#');
    for (let i = 0; i < parts.length; i++) {
      let part = parts[i];
      const match = part.match(regexp);
      if (!match) {
        continue;
      }
      const issueId = match[0];
      const replacment = generator(issueId);
      part = part.replace(new RegExp(`^${issueId}`), replacment);
      parts[i] = part;
    }

    return parts.join('');
  }
}
