// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// TODO(crbug.com/monorail/4549): Remove this hardcoded data once backend custom
// field grouping is implemented.
export const HARDCODED_FIELD_GROUPS = [
  {
    groupName: 'Feature Team',
    fieldNames: ['PM', 'Tech Lead', 'Tech-Lead', 'TechLead', 'TL',
      'Team', 'UX', 'TE'],
    applicableType: 'FLT-Launch',
  },
  {
    groupName: 'Docs',
    fieldNames: ['PRD', 'DD', 'Design Doc', 'Design-Doc',
      'DesignDoc', 'Mocks', 'Test Plan', 'Test-Plan', 'TestPlan',
      'Metrics'],
    applicableType: 'FLT-Launch',
  },
];

export const fieldGroupMap = (fieldGroupsArg, issueType) => {
  const fieldGroups = groupsForType(fieldGroupsArg, issueType);
  return fieldGroups.reduce((acc, group) => {
    return group.fieldNames.reduce((acc, fieldName) => {
      acc[fieldName] = group.groupName;
      return acc;
    }, acc);
  }, {});
};

/**
 * Get all values for a field, given an issue's fieldValueMap.
 * @param {Map.<string, Array<string>>} fieldValueMap Map where keys are
 *   lowercase fieldNames and values are fieldValue strings.
 * @param {string} fieldName The name of the field to look up.
 * @param {string=} phaseName Name of the phase the field is attached to,
 *   if applicable.
 * @return {Array<string>} The values of the field.
 */
export const valuesForField = (fieldValueMap, fieldName, phaseName) => {
  if (!fieldValueMap) return [];
  return fieldValueMap.get(
      fieldValueMapKey(fieldName, phaseName)) || [];
};

/**
 * Get just one value for a field. Convenient in some cases for
 * fields that are not multi-valued.
 * @param {Map.<string, Array<string>>} fieldValueMap Map where keys are
 *   lowercase fieldNames and values are fieldValue strings.
 * @param {string} fieldName The name of the field to look up.
 * @param {string=} phaseName Name of the phase the field is attached to,
 *   if applicable.
 * @return {string} The value of the field.
 */
export function valueForField(fieldValueMap, fieldName, phaseName) {
  const values = valuesForField(fieldValueMap, fieldName, phaseName);
  return values.length ? values[0] : undefined;
}

/**
 * Helper to generate Map keys for FieldValueMaps in a standard format.
 * @param {string} fieldName Name of the field the value is tied to.
 * @param {string=} phaseName Name of the phase the value is tied to.
 * @return {string}
 */
export const fieldValueMapKey = (fieldName, phaseName) => {
  const key = [fieldName];
  if (phaseName) {
    key.push(phaseName);
  }
  return key.join(' ').toLowerCase();
};

export const groupsForType = (fieldGroups, issueType) => {
  return fieldGroups.filter((group) => {
    if (!group.applicableType) return true;
    return issueType && group.applicableType.toLowerCase() ===
      issueType.toLowerCase();
  });
};

export const fieldDefsWithGroup = (fieldDefs, fieldGroupsArg, issueType) => {
  const fieldGroups = groupsForType(fieldGroupsArg, issueType);
  if (!fieldDefs) return [];
  const groups = [];
  fieldGroups.forEach((group) => {
    const groupFields = [];
    group.fieldNames.forEach((name) => {
      const fd = fieldDefs.find(
          (fd) => (fd.fieldRef.fieldName == name));
      if (fd) {
        groupFields.push(fd);
      }
    });
    if (groupFields.length > 0) {
      groups.push({
        groupName: group.groupName,
        fieldDefs: groupFields,
      });
    }
  });
  return groups;
};

export const fieldDefsWithoutGroup = (fieldDefs, fieldGroups, issueType) => {
  if (!fieldDefs) return [];
  const map = fieldGroupMap(fieldGroups, issueType);
  return fieldDefs.filter((fd) => {
    return !(fd.fieldRef.fieldName in map);
  });
};
