import * as datasourceGithubTags from '../../datasource/github-tags';
import { logger } from '../../logger';
import type { PackageDependency } from '../types';
import { TerraformDependencyTypes } from './common';
import type { ExtractionResult } from './types';
import { keyValueExtractionRegex } from './util';

export function extractTerraformRequiredVersion(
  startingLine: number,
  lines: string[]
): ExtractionResult {
  const deps: PackageDependency[] = [];
  let lineNumber = startingLine;
  let braceCounter = 0;
  do {
    // istanbul ignore if
    if (lineNumber > lines.length - 1) {
      logger.debug(`Malformed Terraform file detected.`);
    }

    const line = lines[lineNumber];
    // `{` will be counted wit +1 and `}` with -1. Therefore if we reach braceCounter == 0. We have found the end of the terraform block
    const openBrackets = (line.match(/\{/g) || []).length; // TODO #12070
    const closedBrackets = (line.match(/\}/g) || []).length; // TODO #12070
    braceCounter = braceCounter + openBrackets - closedBrackets;

    const kvMatch = keyValueExtractionRegex.exec(line);
    if (kvMatch && kvMatch.groups.key === 'required_version') {
      const dep: PackageDependency = {
        currentValue: kvMatch.groups.value,
        lineNumber,
        managerData: {
          terraformDependencyType: TerraformDependencyTypes.terraform_version,
        },
      };
      deps.push(dep);
      // returning starting line as required_providers are also in the terraform block
      // if we would return the position of the required_version line we would potentially skip the providers
      return { lineNumber: startingLine, dependencies: deps };
    }

    lineNumber += 1;
  } while (braceCounter !== 0);
  return null;
}

export function analyseTerraformVersion(dep: PackageDependency): void {
  dep.depType = 'required_version';
  dep.datasource = datasourceGithubTags.id;
  dep.depName = 'hashicorp/terraform';
  dep.extractVersion = 'v(?<version>.*)$';
  /* eslint-enable no-param-reassign */
}