package org.apache.lucene.index;

/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/** @lucene.experimental */
public final class FieldInfo {
  public static final int UNASSIGNED_CODEC_ID = -1;
  public final String name;
  public final int number;

  public boolean isIndexed;

  // true if term vector for this field should be stored
  boolean storeTermVector;
  boolean storeOffsetWithTermVector;
  boolean storePositionWithTermVector;

  public boolean omitNorms; // omit norms associated with indexed fields  
  public boolean omitTermFreqAndPositions;

  public boolean storePayloads; // whether this field stores payloads together with term positions
  private int codecId = UNASSIGNED_CODEC_ID; // set inside SegmentCodecs#build() during segment flush - this is used to identify the codec used to write this field

  FieldInfo(String na, boolean tk, int nu, boolean storeTermVector, 
            boolean storePositionWithTermVector,  boolean storeOffsetWithTermVector, 
            boolean omitNorms, boolean storePayloads, boolean omitTermFreqAndPositions) {
    name = na;
    isIndexed = tk;
    number = nu;
    if (isIndexed) {
      this.storeTermVector = storeTermVector;
      this.storeOffsetWithTermVector = storeOffsetWithTermVector;
      this.storePositionWithTermVector = storePositionWithTermVector;
      this.storePayloads = storePayloads;
      this.omitNorms = omitNorms;
      this.omitTermFreqAndPositions = omitTermFreqAndPositions;
    } else { // for non-indexed fields, leave defaults
      this.storeTermVector = false;
      this.storeOffsetWithTermVector = false;
      this.storePositionWithTermVector = false;
      this.storePayloads = false;
      this.omitNorms = false;
      this.omitTermFreqAndPositions = false;
    }
    assert !omitTermFreqAndPositions || !storePayloads;
  }

  void setCodecId(int codecId) {
    assert this.codecId == UNASSIGNED_CODEC_ID : "CodecId can only be set once.";
    this.codecId = codecId;
  }

  public int getCodecId() {
    return codecId;
  }

  @Override
  public Object clone() {
    FieldInfo clone = new FieldInfo(name, isIndexed, number, storeTermVector, storePositionWithTermVector,
                         storeOffsetWithTermVector, omitNorms, storePayloads, omitTermFreqAndPositions);
    clone.codecId = this.codecId;
    return clone;
  }

  // should only be called by FieldInfos#addOrUpdate
  void update(boolean isIndexed, boolean storeTermVector, boolean storePositionWithTermVector, 
              boolean storeOffsetWithTermVector, boolean omitNorms, boolean storePayloads, boolean omitTermFreqAndPositions) {

    if (this.isIndexed != isIndexed) {
      this.isIndexed = true;                      // once indexed, always index
    }
    if (isIndexed) { // if updated field data is not for indexing, leave the updates out
      if (this.storeTermVector != storeTermVector) {
        this.storeTermVector = true;                // once vector, always vector
      }
      if (this.storePositionWithTermVector != storePositionWithTermVector) {
        this.storePositionWithTermVector = true;                // once vector, always vector
      }
      if (this.storeOffsetWithTermVector != storeOffsetWithTermVector) {
        this.storeOffsetWithTermVector = true;                // once vector, always vector
      }
      if (this.storePayloads != storePayloads) {
        this.storePayloads = true;
      }
      if (this.omitNorms != omitNorms) {
        this.omitNorms = true;                // if one require omitNorms at least once, it remains off for life
      }
      if (this.omitTermFreqAndPositions != omitTermFreqAndPositions) {
        this.omitTermFreqAndPositions = true;                // if one require omitTermFreqAndPositions at least once, it remains off for life
        this.storePayloads = false;
      }
    }
    assert !this.omitTermFreqAndPositions || !this.storePayloads;
  }
  private boolean vectorsCommitted;

  /**
   * Reverts all uncommitted changes on this {@link FieldInfo}
   * @see #commitVectors()
   */
  void revertUncommitted() {
    if (storeTermVector && !vectorsCommitted) {
      storeOffsetWithTermVector = false;
      storePositionWithTermVector = false;
      storeTermVector = false;  
    }
  }

  /**
   * Commits term vector modifications. Changes to term-vectors must be
   * explicitly committed once the necessary files are created. If those changes
   * are not committed subsequent {@link #revertUncommitted()} will reset the
   * all term-vector flags before the next document.
   */
  void commitVectors() {
    assert storeTermVector;
    vectorsCommitted = true;
  }
}
