/*
 * Copyright 2014 Piotr Caban for CodeWeavers
 *
 * 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
 */

#define COBJMACROS

#include "oleacc_private.h"

#include "wine/unicode.h"
#include "wine/debug.h"

WINE_DEFAULT_DEBUG_CHANNEL(oleacc);

typedef struct {
    IAccessible IAccessible_iface;
    IOleWindow IOleWindow_iface;
    IEnumVARIANT IEnumVARIANT_iface;

    LONG ref;
} Window;

static inline Window* impl_from_Window(IAccessible *iface)
{
    return CONTAINING_RECORD(iface, Window, IAccessible_iface);
}

static HRESULT WINAPI Window_QueryInterface(IAccessible *iface, REFIID riid, void **ppv)
{
    Window *This = impl_from_Window(iface);

    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);

    if(IsEqualIID(riid, &IID_IAccessible) ||
            IsEqualIID(riid, &IID_IDispatch) ||
            IsEqualIID(riid, &IID_IUnknown)) {
        *ppv = iface;
    }else if(IsEqualIID(riid, &IID_IOleWindow)) {
        *ppv = &This->IOleWindow_iface;
    }else if(IsEqualIID(riid, &IID_IEnumVARIANT)) {
        *ppv = &This->IEnumVARIANT_iface;
    }else {
        WARN("no interface: %s\n", debugstr_guid(riid));
        *ppv = NULL;
        return E_NOINTERFACE;
    }

    IAccessible_AddRef(iface);
    return S_OK;
}

static ULONG WINAPI Window_AddRef(IAccessible *iface)
{
    Window *This = impl_from_Window(iface);
    ULONG ref = InterlockedIncrement(&This->ref);

    TRACE("(%p) ref = %u\n", This, ref);
    return ref;
}

static ULONG WINAPI Window_Release(IAccessible *iface)
{
    Window *This = impl_from_Window(iface);
    ULONG ref = InterlockedDecrement(&This->ref);

    TRACE("(%p) ref = %u\n", This, ref);

    if(!ref)
        heap_free(This);
    return ref;
}

static HRESULT WINAPI Window_GetTypeInfoCount(IAccessible *iface, UINT *pctinfo)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%p)\n", This, pctinfo);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_GetTypeInfo(IAccessible *iface,
        UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%u %x %p)\n", This, iTInfo, lcid, ppTInfo);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_GetIDsOfNames(IAccessible *iface, REFIID riid,
        LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%s %p %u %x %p)\n", This, debugstr_guid(riid),
            rgszNames, cNames, lcid, rgDispId);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_Invoke(IAccessible *iface, DISPID dispIdMember,
        REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
        VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%x %s %x %x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
            lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_get_accParent(IAccessible *iface, IDispatch **ppdispParent)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%p)\n", This, ppdispParent);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_get_accChildCount(IAccessible *iface, LONG *pcountChildren)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%p)\n", This, pcountChildren);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_get_accChild(IAccessible *iface,
        VARIANT varChildID, IDispatch **ppdispChild)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varChildID), ppdispChild);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_get_accName(IAccessible *iface, VARIANT varID, BSTR *pszName)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszName);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_get_accValue(IAccessible *iface, VARIANT varID, BSTR *pszValue)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszValue);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_get_accDescription(IAccessible *iface,
        VARIANT varID, BSTR *pszDescription)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszDescription);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_get_accRole(IAccessible *iface, VARIANT varID, VARIANT *pvarRole)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pvarRole);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_get_accState(IAccessible *iface, VARIANT varID, VARIANT *pvarState)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pvarState);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_get_accHelp(IAccessible *iface, VARIANT varID, BSTR *pszHelp)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszHelp);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_get_accHelpTopic(IAccessible *iface,
        BSTR *pszHelpFile, VARIANT varID, LONG *pidTopic)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%p %s %p)\n", This, pszHelpFile, debugstr_variant(&varID), pidTopic);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_get_accKeyboardShortcut(IAccessible *iface,
        VARIANT varID, BSTR *pszKeyboardShortcut)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszKeyboardShortcut);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_get_accFocus(IAccessible *iface, VARIANT *pvarID)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%p)\n", This, pvarID);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_get_accSelection(IAccessible *iface, VARIANT *pvarID)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%p)\n", This, pvarID);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_get_accDefaultAction(IAccessible *iface,
        VARIANT varID, BSTR *pszDefaultAction)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszDefaultAction);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_accSelect(IAccessible *iface, LONG flagsSelect, VARIANT varID)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%x %s)\n", This, flagsSelect, debugstr_variant(&varID));
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_accLocation(IAccessible *iface, LONG *pxLeft,
        LONG *pyTop, LONG *pcxWidth, LONG *pcyHeight, VARIANT varID)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%p %p %p %p %s)\n", This, pxLeft, pyTop,
            pcxWidth, pcyHeight, debugstr_variant(&varID));
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_accNavigate(IAccessible *iface,
        LONG navDir, VARIANT varStart, VARIANT *pvarEnd)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%d %s %p)\n", This, navDir, debugstr_variant(&varStart), pvarEnd);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_accHitTest(IAccessible *iface,
        LONG xLeft, LONG yTop, VARIANT *pvarID)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%d %d %p)\n", This, xLeft, yTop, pvarID);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_accDoDefaultAction(IAccessible *iface, VARIANT varID)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%s)\n", This, debugstr_variant(&varID));
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_put_accName(IAccessible *iface, VARIANT varID, BSTR pszName)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%s %s)\n", This, debugstr_variant(&varID), debugstr_w(pszName));
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_put_accValue(IAccessible *iface, VARIANT varID, BSTR pszValue)
{
    Window *This = impl_from_Window(iface);
    FIXME("(%p)->(%s %s)\n", This, debugstr_variant(&varID), debugstr_w(pszValue));
    return E_NOTIMPL;
}

static const IAccessibleVtbl WindowVtbl = {
    Window_QueryInterface,
    Window_AddRef,
    Window_Release,
    Window_GetTypeInfoCount,
    Window_GetTypeInfo,
    Window_GetIDsOfNames,
    Window_Invoke,
    Window_get_accParent,
    Window_get_accChildCount,
    Window_get_accChild,
    Window_get_accName,
    Window_get_accValue,
    Window_get_accDescription,
    Window_get_accRole,
    Window_get_accState,
    Window_get_accHelp,
    Window_get_accHelpTopic,
    Window_get_accKeyboardShortcut,
    Window_get_accFocus,
    Window_get_accSelection,
    Window_get_accDefaultAction,
    Window_accSelect,
    Window_accLocation,
    Window_accNavigate,
    Window_accHitTest,
    Window_accDoDefaultAction,
    Window_put_accName,
    Window_put_accValue
};

static inline Window* impl_from_Window_OleWindow(IOleWindow *iface)
{
    return CONTAINING_RECORD(iface, Window, IOleWindow_iface);
}

static HRESULT WINAPI Window_OleWindow_QueryInterface(IOleWindow *iface, REFIID riid, void **ppv)
{
    Window *This = impl_from_Window_OleWindow(iface);
    return IAccessible_QueryInterface(&This->IAccessible_iface, riid, ppv);
}

static ULONG WINAPI Window_OleWindow_AddRef(IOleWindow *iface)
{
    Window *This = impl_from_Window_OleWindow(iface);
    return IAccessible_AddRef(&This->IAccessible_iface);
}

static ULONG WINAPI Window_OleWindow_Release(IOleWindow *iface)
{
    Window *This = impl_from_Window_OleWindow(iface);
    return IAccessible_Release(&This->IAccessible_iface);
}

static HRESULT WINAPI Window_OleWindow_GetWindow(IOleWindow *iface, HWND *phwnd)
{
    Window *This = impl_from_Window_OleWindow(iface);
    FIXME("(%p)->(%p)\n", This, phwnd);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_OleWindow_ContextSensitiveHelp(IOleWindow *iface, BOOL fEnterMode)
{
    Window *This = impl_from_Window_OleWindow(iface);
    FIXME("(%p)->(%x)\n", This, fEnterMode);
    return E_NOTIMPL;
}

static const IOleWindowVtbl WindowOleWindowVtbl = {
    Window_OleWindow_QueryInterface,
    Window_OleWindow_AddRef,
    Window_OleWindow_Release,
    Window_OleWindow_GetWindow,
    Window_OleWindow_ContextSensitiveHelp
};

static inline Window* impl_from_Window_EnumVARIANT(IEnumVARIANT *iface)
{
    return CONTAINING_RECORD(iface, Window, IEnumVARIANT_iface);
}

static HRESULT WINAPI Window_EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
{
    Window *This = impl_from_Window_EnumVARIANT(iface);
    return IAccessible_QueryInterface(&This->IAccessible_iface, riid, ppv);
}

static ULONG WINAPI Window_EnumVARIANT_AddRef(IEnumVARIANT *iface)
{
    Window *This = impl_from_Window_EnumVARIANT(iface);
    return IAccessible_AddRef(&This->IAccessible_iface);
}

static ULONG WINAPI Window_EnumVARIANT_Release(IEnumVARIANT *iface)
{
    Window *This = impl_from_Window_EnumVARIANT(iface);
    return IAccessible_Release(&This->IAccessible_iface);
}

static HRESULT WINAPI Window_EnumVARIANT_Next(IEnumVARIANT *iface,
        ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
{
    Window *This = impl_from_Window_EnumVARIANT(iface);
    FIXME("(%p)->(%u %p %p)\n", This, celt, rgVar, pCeltFetched);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt)
{
    Window *This = impl_from_Window_EnumVARIANT(iface);
    FIXME("(%p)->(%u)\n", This, celt);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_EnumVARIANT_Reset(IEnumVARIANT *iface)
{
    Window *This = impl_from_Window_EnumVARIANT(iface);
    FIXME("(%p)\n", This);
    return E_NOTIMPL;
}

static HRESULT WINAPI Window_EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
{
    Window *This = impl_from_Window_EnumVARIANT(iface);
    FIXME("(%p)->(%p)\n", This, ppEnum);
    return E_NOTIMPL;
}

static const IEnumVARIANTVtbl WindowEnumVARIANTVtbl = {
    Window_EnumVARIANT_QueryInterface,
    Window_EnumVARIANT_AddRef,
    Window_EnumVARIANT_Release,
    Window_EnumVARIANT_Next,
    Window_EnumVARIANT_Skip,
    Window_EnumVARIANT_Reset,
    Window_EnumVARIANT_Clone
};

HRESULT create_window_object(HWND hwnd, const IID *iid, void **obj)
{
    Window *window;
    HRESULT hres;

    if(!IsWindow(hwnd))
        return E_FAIL;

    window = heap_alloc_zero(sizeof(Window));
    if(!window)
        return E_OUTOFMEMORY;

    window->IAccessible_iface.lpVtbl = &WindowVtbl;
    window->IOleWindow_iface.lpVtbl = &WindowOleWindowVtbl;
    window->IEnumVARIANT_iface.lpVtbl = &WindowEnumVARIANTVtbl;
    window->ref = 1;

    hres = IAccessible_QueryInterface(&window->IAccessible_iface, iid, obj);
    IAccessible_Release(&window->IAccessible_iface);
    return hres;
}
