content: /*
   * CSVeed (https://github.com/42BV/CSVeed)
   *
   * Copyright 2013-2023 CSVeed.
   *
   * All rights reserved. This program and the accompanying materials
   * are made available under the terms of The Apache Software License,
   * Version 2.0 which accompanies this distribution, and is available at
   * https://www.apache.org/licenses/LICENSE-2.0.txt
   */
  package org.csveed.row;
  
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.Locale;
  import java.util.Map;
  
  import org.csveed.api.Header;
  import org.csveed.common.Column;
  import org.csveed.report.CsvException;
  import org.csveed.report.GeneralError;
  import org.csveed.report.RowReport;
  
  /**
   * The Class HeaderImpl.
   */
  public class HeaderImpl implements Header {
  
      /** The header. */
      private Line header;
  
      /** The index to name. */
      private Map<Column, String> indexToName = new HashMap<>();
  
      /** The name to index. */
      private Map<String, Column> nameToIndex = new HashMap<>();
  
      /**
       * Instantiates a new header impl.
       *
       * @param row
       *            the row
       */
      public HeaderImpl(Line row) {
          this.header = row;
          Column currentColumn = new Column();
          for (String headerCell : header) {
              this.indexToName.put(currentColumn, headerCell);
              this.nameToIndex.put(headerCell.toLowerCase(Locale.getDefault()), currentColumn);
              currentColumn = currentColumn.nextColumn();
          }
      }
  
      @Override
      public int size() {
          return header.size();
      }
  
      @Override
      public String getName(int columnIndex) {
          Column column = new Column(columnIndex);
          String name = this.indexToName.get(column);
          if (name == null) {
              throw new CsvException(new GeneralError("No column name found for index " + column.getColumnIndex()));
          }
          return name;
      }
  
      @Override
      public int getIndex(String columnName) {
          Column column = this.nameToIndex.get(columnName.toLowerCase(Locale.getDefault()));
          if (column == null) {
              throw new CsvException(new GeneralError("No column index found for name " + columnName));
          }
          return column.getColumnIndex();
      }
  
      @Override
      public Iterator<String> iterator() {
          return header.iterator();
      }
  
      @Override
      public RowReport reportOnEndOfLine() {
          return header.reportOnEndOfLine();
      }
  
  }
  