/* ====================================================================
   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.

   2012 - Alfresco Software, Ltd.
   Alfresco Software has modified source of this file
   The details of changes as svn diff can be found in svn at location root/projects/3rd-party/src
==================================================================== */
package org.apache.poi.ss.usermodel;

import java.util.List;

import org.apache.poi.ss.formula.ConditionalFormattingEvaluator;
import org.apache.poi.ss.formula.EvaluationConditionalFormatRule;

/**
 * Object to hold a number format index and string, for various formatting evaluations
 */
public class ExcelNumberFormat {

    private final int idx;
    private final String format;

    /**
     * @return null if the style is null, instance from style data format values otherwise
     */
    public static ExcelNumberFormat from(CellStyle style) {
        if (style == null) return null;
        return new ExcelNumberFormat(style.getDataFormat(), style.getDataFormatString());
    }

    /**
    * @param cell cell to extract format from
    * @param cfEvaluator ConditionalFormattingEvaluator to use, or null if none in this context
    * @return number format from highest-priority rule with a number format, or the cell style, or null if none of the above apply/are defined
    */
   public static ExcelNumberFormat from(Cell cell, ConditionalFormattingEvaluator cfEvaluator) {
       if (cell == null) return null;

       ExcelNumberFormat nf = null;

       if (cfEvaluator != null) {
           // first one wins (priority order, per Excel help)
           List<EvaluationConditionalFormatRule> rules = cfEvaluator.getConditionalFormattingForCell(cell);
           for (EvaluationConditionalFormatRule rule : rules) {
               nf = rule.getNumberFormat();
               if (nf != null) break;
           }
       }
       if (nf == null) {
           CellStyle style = cell.getCellStyle();
           nf = ExcelNumberFormat.from(style);
       }
       return nf;
   }

    /**
     * Use this carefully, prefer factory methods to ensure id/format relationships are not broken or confused.
     * Left public so {@link ConditionalFormattingRule#getNumberFormat()} implementations can use it.
     * @param idx Excel number format index, either a built-in or a higher custom # mapped in the workbook style table
     * @param format Excel number format string for the index
     */
    public ExcelNumberFormat(int idx, String format) {
        this.idx = idx;
        this.format = format;
    }



    /**
     *
     * @return Excel number format index, either a built-in or a higher custom # mapped in the workbook style table
     */
    public int getIdx() {
        return idx;
    }

    /**
     *
     * @return Excel number format string for the index
     */
    public String getFormat() {
        return format;
    }
}
