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 org.csveed.token.EncounteredSymbol;
  import org.csveed.token.SymbolMapping;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  /**
   * The Class RowInstructionsImpl.
   */
  public class RowInstructionsImpl implements RowInstructions {
  
      /** The Constant LOG. */
      private static final Logger LOG = LoggerFactory.getLogger(RowInstructionsImpl.class);
  
      /** The symbol mapping. */
      private SymbolMapping symbolMapping = new SymbolMapping();
  
      /** The use header. */
      private boolean useHeader = true;
  
      /** The skip empty lines. */
      private boolean skipEmptyLines = true;
  
      /** The settings logged. */
      private boolean settingsLogged;
  
      /** The quote fields. */
      private boolean quoteFields = true;
  
      /**
       * Log settings.
       */
      public void logSettings() {
          if (settingsLogged) {
              return;
          }
          LOG.info("- CSV config / skip empty lines? {}", isSkipEmptyLines() ? "yes" : "no");
          LOG.info("- CSV config / has header line? {}", isUseHeader() ? "yes" : "no");
          settingsLogged = true;
      }
  
      /**
       * Gets the symbol mapping.
       *
       * @return the symbol mapping
       */
      public SymbolMapping getSymbolMapping() {
          return symbolMapping;
      }
  
      /**
       * Checks if is skip empty lines.
       *
       * @return true, if is skip empty lines
       */
      public boolean isSkipEmptyLines() {
          return skipEmptyLines;
      }
  
      @Override
      public boolean isUseHeader() {
          return useHeader;
      }
  
      @Override
      public RowInstructions setUseHeader(boolean useHeader) {
          this.useHeader = useHeader;
          return this;
      }
  
      @Override
      public RowInstructions setStartRow(int startRow) {
          this.symbolMapping.setStartLine(startRow);
          return this;
      }
  
      @Override
      public char getEscape() {
          return this.symbolMapping.getFirstMappedCharacter(EncounteredSymbol.ESCAPE_SYMBOL);
      }
  
      @Override
      public RowInstructions setEscape(char symbol) {
          this.symbolMapping.addMapping(EncounteredSymbol.ESCAPE_SYMBOL, symbol);
          return this;
      }
  
      @Override
      public char getQuote() {
          return symbolMapping.getFirstMappedCharacter(EncounteredSymbol.QUOTE_SYMBOL);
      }
  
      @Override
      public RowInstructions setQuotingEnabled(boolean quoteFields) {
          this.quoteFields = quoteFields;
          return this;
      }
  
      @Override
      public boolean getQuotingEnabled() {
          return quoteFields;
      }
  
      @Override
      public RowInstructions setQuote(char symbol) {
          this.symbolMapping.addMapping(EncounteredSymbol.QUOTE_SYMBOL, symbol);
          return this;
      }
  
      @Override
      public char getSeparator() {
          return symbolMapping.getFirstMappedCharacter(EncounteredSymbol.SEPARATOR_SYMBOL);
      }
  
      @Override
      public RowInstructions setSeparator(char symbol) {
          this.symbolMapping.addMapping(EncounteredSymbol.SEPARATOR_SYMBOL, symbol);
          return this;
      }
  
      @Override
      public RowInstructions setComment(char symbol) {
          this.symbolMapping.addMapping(EncounteredSymbol.COMMENT_SYMBOL, symbol);
          return this;
      }
  
      @Override
      public char[] getEndOfLine() {
          return this.symbolMapping.getMappedCharacters(EncounteredSymbol.EOL_SYMBOL);
      }
  
      @Override
      public RowInstructions setEndOfLine(char[] symbols) {
          this.symbolMapping.addMapping(EncounteredSymbol.EOL_SYMBOL, symbols);
          return this;
      }
  
      @Override
      public RowInstructions skipEmptyLines(boolean skip) {
          this.skipEmptyLines = skip;
          return this;
      }
  
      @Override
      public RowInstructions skipCommentLines(boolean skip) {
          this.symbolMapping.setSkipCommentLines(skip);
          return this;
      }
  
  }
  