WindowLevel WindowLevelHelper::getCurrentAutomaticWindowLevel(Volume *volume)
{
    WindowLevel automaticWindowLevel;
    automaticWindowLevel.setName(QObject::tr("Auto"));

    if (volume)
    {
        double range[2];
        volume->getScalarRange(range);
        
        double windowWidth = range[1] - range[0];
        if (VolumeHelper::isPrimaryPET(volume) || VolumeHelper::isPrimaryNM(volume))
        {
            windowWidth *= DefaultPETWindowWidthThreshold;
        }

        double windowCenter = range[0] + (windowWidth * 0.5);

        // If MONOCHROME1 image, window/level is inverted
        Image *image = volume->getImage(0);
        if (image && image->getPhotometricInterpretation() == PhotometricInterpretation::Monochrome1)
        {
            windowWidth = -windowWidth;
        }
        
        automaticWindowLevel.setWidth(windowWidth);
        automaticWindowLevel.setCenter(windowCenter);
    }
    else
    {
        DEBUG_LOG("No input to compute automatic ww/wl. Undefined values.");
    }

    return automaticWindowLevel;
}
QList<WindowLevel*> CustomWindowLevelsReader::readFile(const QString &path)
{
    QFile file(path);
    if (!file.open(QFile::ReadOnly | QFile::Text))
    {
        return QList<WindowLevel*>();
    }

    if (!m_customWindowLevelsSchemaValidator.validate(QUrl::fromLocalFile(file.fileName())))
    {
        DEBUG_LOG("No es processa perquè es invalid");
        return QList<WindowLevel*>();
    }

    QList<WindowLevel*> listOfCustomWindowLevels;

    QXmlStreamReader reader(&file);
    if (reader.readNextStartElement())
    {
        if (reader.name() == "CustomWindowLevels")
        {
            while (reader.readNextStartElement())
            {
                if (reader.name() == "CustomWindowLevel")
                {
                    WindowLevel *customWindowLevel = new WindowLevel();
                    QString name = reader.attributes().first().value().toString();
                    customWindowLevel->setName(name);

                    while (reader.readNextStartElement())
                    {
                        if (reader.name() == "width")
                        {
                            customWindowLevel->setWidth(reader.readElementText().toDouble());
                        }
                        else if (reader.name() == "level")
                        {
                            customWindowLevel->setCenter(reader.readElementText().toDouble());
                        }
                    }
                    listOfCustomWindowLevels.append(customWindowLevel);
                }
            }
        }
    }

    return listOfCustomWindowLevels;
}
void VolumeDisplayUnit::updateCurrentImageDefaultPresets()
{
    if (getViewPlane() == OrthogonalPlane::XYPlane)
    {
        Image *image = getVolume()->getImage(m_sliceHandler->getCurrentSlice(), m_sliceHandler->getCurrentPhase());
        if (image)
        {
            for (int i = 0; i < image->getNumberOfWindowLevels(); ++i)
            {
                WindowLevel windowLevel = WindowLevelHelper().getDefaultWindowLevelForPresentation(image, i);
                m_windowLevelData->updatePreset(windowLevel);
            }
        }
    }
    
    WindowLevel wl = m_windowLevelData->getCurrentPreset();
    m_imagePipeline->setWindowLevel(wl.getWidth(), wl.getCenter());
}
WindowLevel WindowLevelHelper::getDefaultWindowLevelForPresentation(Image *image, int index)
{
    if (!image)
    {
        return WindowLevel();
    }

    WindowLevel windowLevel = image->getWindowLevel(index);
    if (windowLevel.isValid())
    {
        if (image->getPhotometricInterpretation() == PhotometricInterpretation::Monochrome1)
        {
            windowLevel.setWidth(-windowLevel.getWidth());
        }

        if (windowLevel.getName().isEmpty())
        {
            windowLevel.setName(getDefaultWindowLevelDescription(index));
        }
    }

    return windowLevel;
}
void VolumeDisplayUnit::updateWindowLevel(const WindowLevel &windowLevel)
{
    m_windowLevelData->setCurrentPreset(windowLevel);
    m_imagePipeline->setWindowLevel(windowLevel.getWidth(), windowLevel.getCenter());
}