/*
 * Implementation of IDirect3DRMMaterial2 interface
 *
 * Copyright 2012 Christian Costa
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "wine/debug.h"

#define COBJMACROS

#include "winbase.h"
#include "wingdi.h"

#include "d3drm_private.h"

WINE_DEFAULT_DEBUG_CHANNEL(d3drm);

typedef struct
{
    D3DVALUE r;
    D3DVALUE g;
    D3DVALUE b;
} color_rgb;

typedef struct {
    IDirect3DRMMaterial2 IDirect3DRMMaterial2_iface;
    LONG ref;
    color_rgb emissive;
    color_rgb specular;
    D3DVALUE power;
    color_rgb ambient;
} IDirect3DRMMaterialImpl;

static inline IDirect3DRMMaterialImpl *impl_from_IDirect3DRMMaterial2(IDirect3DRMMaterial2 *iface)
{
    return CONTAINING_RECORD(iface, IDirect3DRMMaterialImpl, IDirect3DRMMaterial2_iface);
}

/*** IUnknown methods ***/
static HRESULT WINAPI IDirect3DRMMaterial2Impl_QueryInterface(IDirect3DRMMaterial2* iface,
                                                           REFIID riid, void** ret_iface)
{
    IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface);

    TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ret_iface);

    if (IsEqualGUID(riid, &IID_IUnknown) ||
        IsEqualGUID(riid, &IID_IDirect3DRMMaterial) ||
        IsEqualGUID(riid, &IID_IDirect3DRMMaterial2))
    {
        *ret_iface = &This->IDirect3DRMMaterial2_iface;
    }
    else
    {
        *ret_iface = NULL;
        FIXME("Interface %s not implemented\n", debugstr_guid(riid));
        return E_NOINTERFACE;
    }

    IDirect3DRMMaterial_AddRef(iface);

    return S_OK;
}

static ULONG WINAPI IDirect3DRMMaterial2Impl_AddRef(IDirect3DRMMaterial2* iface)
{
    IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface);
    ULONG ref = InterlockedIncrement(&This->ref);

    TRACE("(%p)->(): new ref = %d\n", iface, ref);

    return ref;
}

static ULONG WINAPI IDirect3DRMMaterial2Impl_Release(IDirect3DRMMaterial2* iface)
{
    IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface);
    ULONG ref = InterlockedDecrement(&This->ref);

    TRACE("(%p)->(): new ref = %d\n", iface, ref);

    if (!ref)
        HeapFree(GetProcessHeap(), 0, This);

    return ref;
}

/*** IDirect3DRMObject methods ***/
static HRESULT WINAPI IDirect3DRMMaterial2Impl_Clone(IDirect3DRMMaterial2 *iface,
        IUnknown *outer, REFIID iid, void **out)
{
    FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMMaterial2Impl_AddDestroyCallback(IDirect3DRMMaterial2* iface,
                                                                  D3DRMOBJECTCALLBACK cb,
                                                                  LPVOID argument)
{
    FIXME("(%p)->(%p, %p): stub\n", iface, cb, argument);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMMaterial2Impl_DeleteDestroyCallback(IDirect3DRMMaterial2* iface,
                                                                     D3DRMOBJECTCALLBACK cb,
                                                                     LPVOID argument)
{
    FIXME("(%p)->(%p, %p): stub\n", iface, cb, argument);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMMaterial2Impl_SetAppData(IDirect3DRMMaterial2* iface,
                                                          DWORD data)
{
    FIXME("(%p)->(%u): stub\n", iface, data);

    return E_NOTIMPL;
}

static DWORD WINAPI IDirect3DRMMaterial2Impl_GetAppData(IDirect3DRMMaterial2* iface)
{
    FIXME("(%p)->(): stub\n", iface);

    return 0;
}

static HRESULT WINAPI IDirect3DRMMaterial2Impl_SetName(IDirect3DRMMaterial2* iface, LPCSTR name)
{
    FIXME("(%p)->(%s): stub\n", iface, name);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMMaterial2Impl_GetName(IDirect3DRMMaterial2* iface,
                                                       LPDWORD size, LPSTR name)
{
    FIXME("(%p)->(%p, %p): stub\n", iface, size, name);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMMaterial2Impl_GetClassName(IDirect3DRMMaterial2* iface,
                                                           LPDWORD size, LPSTR name)
{
    TRACE("(%p)->(%p, %p)\n", iface, size, name);

    if (!size || *size < strlen("Material") || !name)
        return E_INVALIDARG;

    strcpy(name, "Material");
    *size = sizeof("Material");

    return D3DRM_OK;
}

/*** IDirect3DRMMaterial methods ***/
static HRESULT WINAPI IDirect3DRMMaterial2Impl_SetPower(IDirect3DRMMaterial2* iface, D3DVALUE power)
{
    IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface);

    TRACE("(%p)->(%f)\n", iface, power);

    This->power = power;

    return D3DRM_OK;
}

static HRESULT WINAPI IDirect3DRMMaterial2Impl_SetSpecular(IDirect3DRMMaterial2* iface,
                                                           D3DVALUE r, D3DVALUE g, D3DVALUE b)
{
    IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface);

    TRACE("(%p)->(%f, %f, %f)\n", iface, r, g, b);

    This->specular.r = r;
    This->specular.g = g;
    This->specular.b = b;

    return D3DRM_OK;
}

static HRESULT WINAPI IDirect3DRMMaterial2Impl_SetEmissive(IDirect3DRMMaterial2* iface,
                                                           D3DVALUE r, D3DVALUE g, D3DVALUE b)
{
    IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface);

    TRACE("(%p)->(%f, %f, %f)\n", iface, r, g, b);

    This->emissive.r = r;
    This->emissive.g = g;
    This->emissive.b = b;

    return D3DRM_OK;
}

static D3DVALUE WINAPI IDirect3DRMMaterial2Impl_GetPower(IDirect3DRMMaterial2* iface)
{
    IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface);

    TRACE("(%p)->()\n", iface);

    return This->power;
}

static HRESULT WINAPI IDirect3DRMMaterial2Impl_GetSpecular(IDirect3DRMMaterial2* iface,
                                                           D3DVALUE* r, D3DVALUE* g, D3DVALUE* b)
{
    IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface);

    TRACE("(%p)->(%p, %p, %p)\n", iface, r, g, b);

    *r = This->specular.r;
    *g = This->specular.g;
    *b = This->specular.b;

    return D3DRM_OK;
}

static HRESULT WINAPI IDirect3DRMMaterial2Impl_GetEmissive(IDirect3DRMMaterial2* iface,
                                                           D3DVALUE* r, D3DVALUE* g, D3DVALUE* b)
{
    IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface);

    TRACE("(%p)->(%p, %p, %p)\n", iface, r, g, b);

    *r = This->emissive.r;
    *g = This->emissive.g;
    *b = This->emissive.b;

    return D3DRM_OK;
}

/*** IDirect3DRMMaterial2 methods ***/
static HRESULT WINAPI IDirect3DRMMaterial2Impl_GetAmbient(IDirect3DRMMaterial2* iface,
                                                          D3DVALUE* r, D3DVALUE* g, D3DVALUE* b)
{
    IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface);

    TRACE("(%p)->(%p, %p, %p)\n", iface, r, g, b);

    *r = This->ambient.r;
    *g = This->ambient.g;
    *b = This->ambient.b;

    return D3DRM_OK;
}

static HRESULT WINAPI IDirect3DRMMaterial2Impl_SetAmbient(IDirect3DRMMaterial2* iface,
                                                          D3DVALUE r, D3DVALUE g, D3DVALUE b)
{
    IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface);

    TRACE("(%p)->(%f, %f, %f)\n", iface, r, g, b);

    This->ambient.r = r;
    This->ambient.g = g;
    This->ambient.b = b;

    return D3DRM_OK;
}

static const struct IDirect3DRMMaterial2Vtbl Direct3DRMMaterial2_Vtbl =
{
    /*** IUnknown methods ***/
    IDirect3DRMMaterial2Impl_QueryInterface,
    IDirect3DRMMaterial2Impl_AddRef,
    IDirect3DRMMaterial2Impl_Release,
    /*** IDirect3DRMObject methods ***/
    IDirect3DRMMaterial2Impl_Clone,
    IDirect3DRMMaterial2Impl_AddDestroyCallback,
    IDirect3DRMMaterial2Impl_DeleteDestroyCallback,
    IDirect3DRMMaterial2Impl_SetAppData,
    IDirect3DRMMaterial2Impl_GetAppData,
    IDirect3DRMMaterial2Impl_SetName,
    IDirect3DRMMaterial2Impl_GetName,
    IDirect3DRMMaterial2Impl_GetClassName,
    /*** IDirect3DRMMaterial methods ***/
    IDirect3DRMMaterial2Impl_SetPower,
    IDirect3DRMMaterial2Impl_SetSpecular,
    IDirect3DRMMaterial2Impl_SetEmissive,
    IDirect3DRMMaterial2Impl_GetPower,
    IDirect3DRMMaterial2Impl_GetSpecular,
    IDirect3DRMMaterial2Impl_GetEmissive,
    /*** IDirect3DRMMaterial2 methods ***/
    IDirect3DRMMaterial2Impl_GetAmbient,
    IDirect3DRMMaterial2Impl_SetAmbient
};

HRESULT Direct3DRMMaterial_create(IDirect3DRMMaterial2** ret_iface)
{
    IDirect3DRMMaterialImpl* object;

    TRACE("(%p)\n", ret_iface);

    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMMaterialImpl));
    if (!object)
        return E_OUTOFMEMORY;

    object->IDirect3DRMMaterial2_iface.lpVtbl = &Direct3DRMMaterial2_Vtbl;
    object->ref = 1;

    object->specular.r = 1.0f;
    object->specular.g = 1.0f;
    object->specular.b = 1.0f;

    *ret_iface = &object->IDirect3DRMMaterial2_iface;

    return S_OK;
}
