import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

public class Index {
  public static final class Occurence {
    private final int lineNumber;
    private final int columnNumber;
    
    Occurence(int lineNumber, int columnNumber) {
      this.lineNumber = lineNumber;
      this.columnNumber = columnNumber;
    }
    
    public int getLineNumber() {
      return lineNumber;
    }
    public int getColumnNumber() {
      return columnNumber;
    }
    
    @Override
    public String toString() {
      return lineNumber + ":" + columnNumber;
    }
  }

  private final HashMap<String, List<Occurence>> indexMap;

  public Index(Path path) throws IOException {
    HashMap<String, List<Occurence>> indexMap = new HashMap<>();
    try(BufferedReader reader = Files.newBufferedReader(path)) {
      int lineNumber = 1;
      String line;
      while((line = reader.readLine()) != null) {
        int start = -1;
        for(int i = 0; i < line.length(); i++) {
          if (Character.isLetter(line.charAt(i))) {
            if (start == -1) {
              start = i;
            }
            continue;
          } 
          if (start == -1) {
            continue;
          }
          indexMap.computeIfAbsent(line.substring(start, i), key -> new ArrayList<>())
                  .add(new Occurence(lineNumber, 1 + start));
          start = -1;
        }
        if (start != -1) {
          indexMap.computeIfAbsent(line.substring(start), key -> new ArrayList<>())
                  .add(new Occurence(lineNumber, 1 + start));
        }
        lineNumber++;
      }
    }
    this.indexMap = indexMap;
  }

  public List<Occurence> getOccurences(String key) {
    return indexMap.getOrDefault(key, Collections.emptyList());
  }
}