/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "qdeclarativecamera_p.h"
#include "qdeclarativecameracapture_p.h"
#include "qdeclarativecamerapreviewprovider_p.h"

#include <qmetadatawritercontrol.h>

#include <QtCore/qurl.h>

QT_BEGIN_NAMESPACE

/*!
    \qmltype CameraCapture
    \instantiates QDeclarativeCameraCapture
    \brief An interface for capturing camera images.
    \ingroup multimedia_qml
    \inqmlmodule QtMultimedia
    \ingroup camera_qml

    This type allows you to capture still images and be notified when they
    are available or saved to disk.  You can adjust the resolution of the captured
    image and where the saved image should go.

    CameraCapture is a child of a \l Camera (as the \c imageCapture property)
    and cannot be created directly.

    \qml
    Item {
        width: 640
        height: 360

        Camera {
            id: camera

            imageCapture {
                onImageCaptured: {
                    // Show the preview in an Image
                    photoPreview.source = preview
                }
            }
        }

        VideoOutput {
            source: camera
            focus : visible // to receive focus and capture key events when visible
            anchors.fill: parent

            MouseArea {
                anchors.fill: parent;
                onClicked: camera.imageCapture.capture();
            }
        }

        Image {
            id: photoPreview
        }
    }
    \endqml

*/

QDeclarativeCameraCapture::QDeclarativeCameraCapture(QCamera *camera, QObject *parent) :
    QObject(parent),
    m_camera(camera)
{
    m_capture = new QCameraImageCapture(camera, this);

    connect(m_capture, SIGNAL(readyForCaptureChanged(bool)), this, SIGNAL(readyForCaptureChanged(bool)));
    connect(m_capture, SIGNAL(imageExposed(int)), this, SIGNAL(imageExposed(int)));
    connect(m_capture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(_q_imageCaptured(int,QImage)));
    connect(m_capture, SIGNAL(imageMetadataAvailable(int,QString,QVariant)), this,
            SLOT(_q_imageMetadataAvailable(int,QString,QVariant)));
    connect(m_capture, SIGNAL(imageSaved(int,QString)), this, SLOT(_q_imageSaved(int,QString)));
    connect(m_capture, SIGNAL(error(int,QCameraImageCapture::Error,QString)),
            this, SLOT(_q_captureFailed(int,QCameraImageCapture::Error,QString)));

    connect(m_camera, SIGNAL(statusChanged(QCamera::Status)),
            this, SLOT(_q_cameraStatusChanged(QCamera::Status)));

    QMediaService *service = camera->service();
    m_metadataWriterControl = service ? service->requestControl<QMetaDataWriterControl*>() : 0;
}

QDeclarativeCameraCapture::~QDeclarativeCameraCapture()
{
}

/*!
    \property QDeclarativeCameraCapture::ready

    This property holds a bool value indicating whether the camera
    is ready to capture photos or not.

    Calling capture() while \e ready is \c false is not permitted and
    results in an error.
*/

/*!
    \qmlproperty bool QtMultimedia::CameraCapture::ready

    This property holds a bool value indicating whether the camera
    is ready to capture photos or not.

    Calling capture() while \e ready is \c false is not permitted and
    results in an error.
*/
bool QDeclarativeCameraCapture::isReadyForCapture() const
{
    return m_capture->isReadyForCapture();
}

/*!
    \qmlmethod QtMultimedia::CameraCapture::capture()

    Start image capture.  The \l imageCaptured and \l imageSaved signals will
    be emitted when the capture is complete.

    The image will be captured to the default system location, typically
    QStandardPaths::writableLocation(QStandardPaths::PicturesLocation) for
    still imaged or QStandardPaths::writableLocation(QStandardPaths::MoviesLocation)
    for video.

    Camera saves all the capture parameters like exposure settings or
    image processing parameters, so changes to camera parameters after
    capture() is called do not affect previous capture requests.

    capture() returns the capture requestId parameter, used with
    imageExposed(), imageCaptured(), imageMetadataAvailable() and imageSaved() signals.

    \sa ready
*/
int QDeclarativeCameraCapture::capture()
{
    return m_capture->capture();
}

/*!
    \qmlmethod QtMultimedia::CameraCapture::captureToLocation(location)

    Start image capture to specified \a location.  The \l imageCaptured and \l imageSaved signals will
    be emitted when the capture is complete.

    CameraCapture::captureToLocation returns the capture requestId parameter, used with
    imageExposed(), imageCaptured(), imageMetadataAvailable() and imageSaved() signals.

    If the application is unable to write to the location specified by \c location
    the CameraCapture will emit an error. The most likely reasons for the application
    to be unable to write to a location is that the path is wrong and the location does not exists,
    or the application does not have write permission for that location.
*/
int QDeclarativeCameraCapture::captureToLocation(const QString &location)
{
    return m_capture->capture(location);
}

/*!
    \qmlmethod QtMultimedia::CameraCapture::cancelCapture()

    Cancel pending image capture requests.
*/

void QDeclarativeCameraCapture::cancelCapture()
{
    m_capture->cancelCapture();
}
/*!
    \property QDeclarativeCameraCapture::capturedImagePath

    This property holds the location of the last captured image.
*/
/*!
    \qmlproperty string QtMultimedia::CameraCapture::capturedImagePath

    This property holds the location of the last captured image.
*/
QString QDeclarativeCameraCapture::capturedImagePath() const
{
    return m_capturedImagePath;
}

void QDeclarativeCameraCapture::_q_imageCaptured(int id, const QImage &preview)
{
    QString previewId = QString("preview_%1").arg(id);
    QDeclarativeCameraPreviewProvider::registerPreview(previewId, preview);

    emit imageCaptured(id, QLatin1String("image://camera/")+previewId);
}

void QDeclarativeCameraCapture::_q_imageSaved(int id, const QString &fileName)
{
    m_capturedImagePath = fileName;
    emit imageSaved(id, fileName);
}

void QDeclarativeCameraCapture::_q_imageMetadataAvailable(int id, const QString &key, const QVariant &value)
{
    emit imageMetadataAvailable(id, key, value);
}


void QDeclarativeCameraCapture::_q_captureFailed(int id, QCameraImageCapture::Error error, const QString &message)
{
    Q_UNUSED(error);
    qWarning() << "QCameraImageCapture error:" << message;
    emit captureFailed(id, message);
}

void QDeclarativeCameraCapture::_q_cameraStatusChanged(QCamera::Status status)
{
    if (status != QCamera::UnloadedStatus && status != QCamera::LoadedStatus &&
            status != QCamera::ActiveStatus)
        return;

    emit supportedResolutionsChanged();
}
/*!
    \property QDeclarativeCameraCapture::resolution

    This property holds the resolution/size of the image to be captured.
    If empty, the system chooses the appropriate resolution.
*/

/*!
    \qmlproperty size QtMultimedia::CameraCapture::resolution

    This property holds the resolution/size of the image to be captured.
    If empty, the system chooses the appropriate resolution.

    \sa supportedResolutions
*/

QSize QDeclarativeCameraCapture::resolution()
{
    return m_imageSettings.resolution();
}

void QDeclarativeCameraCapture::setResolution(const QSize &captureResolution)
{
    m_imageSettings = m_capture->encodingSettings();
    if (captureResolution != resolution()) {
        m_imageSettings.setResolution(captureResolution);
        m_capture->setEncodingSettings(m_imageSettings);
        emit resolutionChanged(captureResolution);
    }
}

QCameraImageCapture::Error QDeclarativeCameraCapture::error() const
{
    return m_capture->error();
}
/*!
    \property QDeclarativeCameraCapture::errorString

    This property holds the error message related to the last capture.
*/

/*!
    \qmlproperty string QtMultimedia::CameraCapture::errorString

    This property holds the error message related to the last capture.
*/
QString QDeclarativeCameraCapture::errorString() const
{
    return m_capture->errorString();
}

/*!
    \qmlproperty list<size> QtMultimedia::CameraCapture::supportedResolutions

    This property holds a list of resolutions which are supported for capturing.
    The information can be used to set a valid \e resolution. If the camera isn't
    loaded, the list will be empty.

    \since 5.9
    \sa resolution
 */
QVariantList QDeclarativeCameraCapture::supportedResolutions()
{
    QVariantList supportedResolutions;
    for (const QSize &res : m_capture->supportedResolutions())
        supportedResolutions.append(QVariant(res));
    return supportedResolutions;
}

/*!
    \qmlmethod QtMultimedia::CameraCapture::setMetadata(key, value)


    Sets a particular metadata \a key to \a value for the subsequent image captures.

    \sa QMediaMetaData
*/
void QDeclarativeCameraCapture::setMetadata(const QString &key, const QVariant &value)
{
    if (m_metadataWriterControl)
        m_metadataWriterControl->setMetaData(key, value);
}

/*!
    \qmlsignal QtMultimedia::CameraCapture::captureFailed(requestId, message)

    This signal is emitted when an error occurs during capture with \a requestId.
    A descriptive message is available in \a message.

    The corresponding handler is \c onCaptureFailed.
*/

/*!
    \qmlsignal QtMultimedia::CameraCapture::imageCaptured(requestId, preview)

    This signal is emitted when an image with \a requestId has been captured
    but not yet saved to the filesystem.  The \a preview
    parameter can be used as the URL supplied to an \l Image.

    The corresponding handler is \c onImageCaptured.

    \sa imageSaved
*/

/*!
    \qmlsignal QtMultimedia::CameraCapture::imageSaved(requestId, path)

    This signal is emitted after the image with \a requestId has been written to the filesystem.
    The \a path is a local file path, not a URL.

    The corresponding handler is \c onImageSaved.

    \sa imageCaptured
*/


/*!
    \qmlsignal QtMultimedia::CameraCapture::imageMetadataAvailable(requestId, key, value)

    This signal is emitted when the image with \a requestId has new metadata
    available with the key \a key and value \a value.

    The corresponding handler is \c onImageMetadataAvailable.

    \sa imageCaptured
*/


QT_END_NAMESPACE

#include "moc_qdeclarativecameracapture_p.cpp"
