/////////////////////////////////////////////////////////////////////////////////
//
//  Copyright (C) 2015-     Statoil ASA
//  Copyright (C) 2015-     Ceetron Solutions AS
//
//  ResInsight is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
//  WARRANTY; without even the implied warranty of MERCHANTABILITY or
//  FITNESS FOR A PARTICULAR PURPOSE.
//
//  See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
//  for more details.
//
/////////////////////////////////////////////////////////////////////////////////

#include "RiaCurveDataTools.h"

#include <cmath> // Needed for HUGE_VAL on Linux

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiaCurveDataTools::CurveIntervals RiaCurveDataTools::calculateIntervalsOfValidValues( const std::vector<double>& values,
                                                                                      bool                       includePositiveValuesOnly )
{
    CurveIntervals intervals;

    int    startIdx = -1;
    size_t vIdx     = 0;

    size_t valueCount = values.size();
    while ( vIdx < valueCount )
    {
        bool isValid = RiaCurveDataTools::isValidValue( values[vIdx], includePositiveValuesOnly );

        if ( !isValid )
        {
            if ( startIdx >= 0 )
            {
                size_t endIdx = vIdx - 1;
                intervals.push_back( std::make_pair( startIdx, endIdx ) );
                startIdx = -1;
            }
        }
        else if ( startIdx < 0 )
        {
            startIdx = (int)vIdx;
        }

        vIdx++;
    }

    if ( startIdx >= 0 && startIdx < ( (int)valueCount ) )
    {
        intervals.push_back( std::make_pair( startIdx, valueCount - 1 ) );
    }

    return intervals;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<std::pair<size_t, size_t>> RiaCurveDataTools::computePolyLineStartStopIndices( const CurveIntervals& intervals )
{
    std::vector<std::pair<size_t, size_t>> lineStartAndStopIndices;

    const size_t intervalCount = intervals.size();
    if ( intervalCount < 1 ) return lineStartAndStopIndices;

    size_t index = 0;
    for ( size_t intIdx = 0; intIdx < intervalCount; intIdx++ )
    {
        size_t intervalSize = intervals[intIdx].second - intervals[intIdx].first + 1;
        lineStartAndStopIndices.push_back( std::make_pair( index, index + intervalSize - 1 ) );

        index += intervalSize;
    }

    return lineStartAndStopIndices;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RiaCurveDataTools::isValidValue( double value, bool allowPositiveValuesOnly )
{
    if ( value == HUGE_VAL || value == -HUGE_VAL || value != value )
    {
        return false;
    }

    if ( allowPositiveValuesOnly && value <= 0 )
    {
        return false;
    }

    return true;
}
