/* ====================================================================
   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.
==================================================================== */
package org.apache.poi.xssf.usermodel;

import java.util.ArrayList;
import java.util.List;

import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.DataValidationConstraint.ValidationType;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDataValidation;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataValidationErrorStyle;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataValidationOperator;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataValidationType;

/**
 * @author <a href="rjankiraman@emptoris.com">Radhakrishnan J</a>
 *
 */
public class XSSFDataValidationHelper implements DataValidationHelper {
	// Findbugs: URF_UNREAD_FIELD. Do not delete without understanding how this class works.
	//private XSSFSheet xssfSheet;
	
    
    public XSSFDataValidationHelper(XSSFSheet xssfSheet) {
		super();
		// Findbugs: URF_UNREAD_FIELD. Do not delete without understanding how this class works.
		//this.xssfSheet = xssfSheet;
	}

	/* (non-Javadoc)
	 * @see org.apache.poi.ss.usermodel.DataValidationHelper#createDateConstraint(int, java.lang.String, java.lang.String, java.lang.String)
	 */
	public DataValidationConstraint createDateConstraint(int operatorType, String formula1, String formula2, String dateFormat) {
		return new XSSFDataValidationConstraint(ValidationType.DATE, operatorType,formula1, formula2);
	}

	/* (non-Javadoc)
	 * @see org.apache.poi.ss.usermodel.DataValidationHelper#createDecimalConstraint(int, java.lang.String, java.lang.String)
	 */
	public DataValidationConstraint createDecimalConstraint(int operatorType, String formula1, String formula2) {
		return new XSSFDataValidationConstraint(ValidationType.DECIMAL, operatorType,formula1, formula2);
	}

	/* (non-Javadoc)
	 * @see org.apache.poi.ss.usermodel.DataValidationHelper#createExplicitListConstraint(java.lang.String[])
	 */
	public DataValidationConstraint createExplicitListConstraint(String[] listOfValues) {
		return new XSSFDataValidationConstraint(listOfValues);
	}

	/* (non-Javadoc)
	 * @see org.apache.poi.ss.usermodel.DataValidationHelper#createFormulaListConstraint(java.lang.String)
	 */
	public DataValidationConstraint createFormulaListConstraint(String listFormula) {
		return new XSSFDataValidationConstraint(ValidationType.LIST, listFormula);
	}

	
	
	public DataValidationConstraint createNumericConstraint(int validationType, int operatorType, String formula1, String formula2) {
		if( validationType==ValidationType.INTEGER) {
			return createIntegerConstraint(operatorType, formula1, formula2);
		} else if ( validationType==ValidationType.DECIMAL) {
			return createDecimalConstraint(operatorType, formula1, formula2);
		} else if ( validationType==ValidationType.TEXT_LENGTH) {
			return createTextLengthConstraint(operatorType, formula1, formula2);
		}
		return null;
	}

	/* (non-Javadoc)
	 * @see org.apache.poi.ss.usermodel.DataValidationHelper#createIntegerConstraint(int, java.lang.String, java.lang.String)
	 */
	public DataValidationConstraint createIntegerConstraint(int operatorType, String formula1, String formula2) {
		return new XSSFDataValidationConstraint(ValidationType.INTEGER, operatorType,formula1,formula2);
	}

	/* (non-Javadoc)
	 * @see org.apache.poi.ss.usermodel.DataValidationHelper#createTextLengthConstraint(int, java.lang.String, java.lang.String)
	 */
	public DataValidationConstraint createTextLengthConstraint(int operatorType, String formula1, String formula2) {
		return new XSSFDataValidationConstraint(ValidationType.TEXT_LENGTH, operatorType,formula1,formula2);
	}

	/* (non-Javadoc)
	 * @see org.apache.poi.ss.usermodel.DataValidationHelper#createTimeConstraint(int, java.lang.String, java.lang.String, java.lang.String)
	 */
	public DataValidationConstraint createTimeConstraint(int operatorType, String formula1, String formula2) {
		return new XSSFDataValidationConstraint(ValidationType.TIME, operatorType,formula1,formula2);
	}

	public DataValidationConstraint createCustomConstraint(String formula) {
		return new XSSFDataValidationConstraint(ValidationType.FORMULA, formula);
	}

	/* (non-Javadoc)
	 * @see org.apache.poi.ss.usermodel.DataValidationHelper#createValidation(org.apache.poi.ss.usermodel.DataValidationConstraint, org.apache.poi.ss.util.CellRangeAddressList)
	 */
	public DataValidation createValidation(DataValidationConstraint constraint, CellRangeAddressList cellRangeAddressList) {
		XSSFDataValidationConstraint dataValidationConstraint = (XSSFDataValidationConstraint)constraint;
		CTDataValidation newDataValidation = CTDataValidation.Factory.newInstance();

		int validationType = constraint.getValidationType();
		switch(validationType) {
			case DataValidationConstraint.ValidationType.LIST:
		    	newDataValidation.setType(STDataValidationType.LIST);
				newDataValidation.setFormula1(constraint.getFormula1());				
		    	break;
			case DataValidationConstraint.ValidationType.ANY:				
				newDataValidation.setType(STDataValidationType.NONE);				
				break;
			case DataValidationConstraint.ValidationType.TEXT_LENGTH:
				newDataValidation.setType(STDataValidationType.TEXT_LENGTH);
				break;				
			case DataValidationConstraint.ValidationType.DATE:
				newDataValidation.setType(STDataValidationType.DATE);
				break;				
			case DataValidationConstraint.ValidationType.INTEGER:
				newDataValidation.setType(STDataValidationType.WHOLE);
				break;				
			case DataValidationConstraint.ValidationType.DECIMAL:
				newDataValidation.setType(STDataValidationType.DECIMAL);
				break;				
			case DataValidationConstraint.ValidationType.TIME:
				newDataValidation.setType(STDataValidationType.TIME);
				break;
			case DataValidationConstraint.ValidationType.FORMULA:
				newDataValidation.setType(STDataValidationType.CUSTOM);
				break;
			default:
				newDataValidation.setType(STDataValidationType.NONE);				
		}
		
		if (validationType!=ValidationType.ANY && validationType!=ValidationType.LIST) {
            STDataValidationOperator.Enum op = XSSFDataValidation.operatorTypeMappings.get(constraint.getOperator());
			if(op != null) {
                newDataValidation.setOperator(op);
            }
			if (constraint.getFormula1() != null) {
				newDataValidation.setFormula1(constraint.getFormula1());
			}
			if (constraint.getFormula2() != null) {
				newDataValidation.setFormula2(constraint.getFormula2());
			}
		}
		
		CellRangeAddress[] cellRangeAddresses = cellRangeAddressList.getCellRangeAddresses();
		List<String> sqref = new ArrayList<String>();
		for (int i = 0; i < cellRangeAddresses.length; i++) {
			CellRangeAddress cellRangeAddress = cellRangeAddresses[i];
			sqref.add(cellRangeAddress.formatAsString());
		}
		newDataValidation.setSqref(sqref);
		newDataValidation.setAllowBlank(true);
		newDataValidation.setErrorStyle(STDataValidationErrorStyle.STOP);
		
		return new XSSFDataValidation(dataValidationConstraint,cellRangeAddressList,newDataValidation);
	}
}
