/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "NapiInitPart1Test.cpp"
#include "NapiInitPart2Test.cpp"
#include "NapiInitPart3Test.cpp"
#include "NapiInitPart4Test.cpp"

#define DRAWING_NUMBER_1 1


// Include the split implementation files

inline napi_property_descriptor MakeNapiDesc(const char* name, napi_callback cb)
{
    return { name, nullptr, cb, nullptr, nullptr, nullptr, napi_default, nullptr };
}

#define DECL_NAPI_DESC(fn) /* NOLINT(G.PRE.02-CPP) */ MakeNapiDesc(#fn, fn)

static const napi_property_descriptor g_drawingNativeDescriptors[] = {
    DECL_NAPI_DESC(DrawingCanvasDrawRecordCmd),
    DECL_NAPI_DESC(DrawingRecordCmdDestroy),
    DECL_NAPI_DESC(DrawingRecordCmdUtilsBeginRecording),
    DECL_NAPI_DESC(DrawingRecordCmdUtilsDestroy),
    DECL_NAPI_DESC(DrawingRecordCmdUtilsFinishRecording),
    DECL_NAPI_DESC(DrawingCanvasDrawSingleChaWithFeatures),
    DECL_NAPI_DESC(DrawingMemoryStream),
    DECL_NAPI_DESC(DrawingPointCreate),
    DECL_NAPI_DESC(DrawingPointDestroy),
    DECL_NAPI_DESC(DrawingPointGetSet),
    DECL_NAPI_DESC(DrawingPointNegateOffset),
    DECL_NAPI_DESC(DrawingRegionBasicOperations),
    DECL_NAPI_DESC(DrawingRegionQueryOperations),
    DECL_NAPI_DESC(DrawingPathEffect),
    DECL_NAPI_DESC(DrawingPathBasic),
    DECL_NAPI_DESC(DrawingPathRelative),
    DECL_NAPI_DESC(DrawingPathAddShape),
    DECL_NAPI_DESC(DrawingPathPart2Add),
    DECL_NAPI_DESC(DrawingPathPart2Transform),
    DECL_NAPI_DESC(DrawingPathPart2GetSet),
    DECL_NAPI_DESC(DrawingPathPart3Query),
    DECL_NAPI_DESC(DrawingPathPart3Transform),
    DECL_NAPI_DESC(DrawingPathPart3Advanced),
    DECL_NAPI_DESC(DrawingCanvasDestroy),
    DECL_NAPI_DESC(DrawingCanvasBind),
    DECL_NAPI_DESC(DrawingCanvasSave),
    DECL_NAPI_DESC(DrawingCanvasSaveLayer),
    DECL_NAPI_DESC(DrawingCanvasRestore),
    DECL_NAPI_DESC(DrawingCanvasRestoreToCount),
    DECL_NAPI_DESC(DrawingCanvasDrawLine),
    DECL_NAPI_DESC(DrawingCanvasDrawPath),
    DECL_NAPI_DESC(DrawingCanvasAttach),
    DECL_NAPI_DESC(DrawingCanvasDetach),
    DECL_NAPI_DESC(DrawingCanvasDrawPixelMapRect),
    DECL_NAPI_DESC(DrawingCanvasDrawBackground),
    DECL_NAPI_DESC(DrawingCanvasDrawRegion),
    DECL_NAPI_DESC(DrawingCanvasDrawPoints),
    DECL_NAPI_DESC(DrawingCanvasDrawBitmap),
    DECL_NAPI_DESC(DrawingCanvasDrawBitmapRect),
    DECL_NAPI_DESC(DrawingCanvasDrawRect),
    DECL_NAPI_DESC(DrawingCanvasDrawCircle),
    DECL_NAPI_DESC(DrawingCanvasDrawOval),
    DECL_NAPI_DESC(DrawingCanvasDrawArc),
    DECL_NAPI_DESC(DrawingCanvasDrawRoundRect),
    DECL_NAPI_DESC(DrawingCanvasDrawTextBlob),
    DECL_NAPI_DESC(DrawingCanvasClipRect),
    DECL_NAPI_DESC(DrawingCanvasClipRoundRect),
    DECL_NAPI_DESC(DrawingCanvasClipPath),
    DECL_NAPI_DESC(DrawingCanvasRotate),
    DECL_NAPI_DESC(DrawingCanvasTranslate),
    DECL_NAPI_DESC(DrawingCanvasScale),
    DECL_NAPI_DESC(DrawingCanvasSkew),
    DECL_NAPI_DESC(DrawingCanvasGetWidthHeight),
    DECL_NAPI_DESC(DrawingCanvasGetLocalClipBounds),
    DECL_NAPI_DESC(DrawingCanvasConcatMatrix),
    DECL_NAPI_DESC(DrawingCanvasDrawShadow),
    DECL_NAPI_DESC(DrawingCanvasClear),
    DECL_NAPI_DESC(DrawingCanvasSetMatrix),
    DECL_NAPI_DESC(DrawingCanvasResetMatrix),
    DECL_NAPI_DESC(DrawingCanvasDrawImageRect),
    DECL_NAPI_DESC(DrawingCanvasDrawVertices),
    DECL_NAPI_DESC(DrawingCanvasReadPixels),
    DECL_NAPI_DESC(DrawingCanvasReadPixelsToBitmap),
    DECL_NAPI_DESC(DrawingCanvasDrawSingleCharacter),
    DECL_NAPI_DESC(DrawingCanvasDrawPoint),
    DECL_NAPI_DESC(DrawingCanvasDrawColor),
    DECL_NAPI_DESC(DrawingCanvasIsClipEmpty),
    DECL_NAPI_DESC(DrawingCanvasGetImageInfo),
    DECL_NAPI_DESC(DrawingCanvasClipRegion),
    DECL_NAPI_DESC(DrawingCanvasQuickRejectPath),
    DECL_NAPI_DESC(DrawingCanvasQuickRejectRect),
    DECL_NAPI_DESC(DrawingCanvasDrawArcWithCenter),
    DECL_NAPI_DESC(DrawingCanvasDrawNestedRoundRect),
    DECL_NAPI_DESC(DrawingCanvasDrawPixelMapNine),
    DECL_NAPI_DESC(DrawingCanvasCreateWithPixelMap),
    DECL_NAPI_DESC(DrawingCanvasDrawPixelMapRectConstraint),
    DECL_NAPI_DESC(DrawingCanvasDrawGlyphs),
    DECL_NAPI_DESC(DrawingCanvasIsOpaque),
    DECL_NAPI_DESC(DrawingColorFilterCreateBlendMode),
    DECL_NAPI_DESC(DrawingColorFilterCreateCompose),
    DECL_NAPI_DESC(DrawingColorFilterCreateMatrix),
    DECL_NAPI_DESC(DrawingColorFilterCreateLinearToSrgbGamma),
    DECL_NAPI_DESC(DrawingColorFilterCreateSrgbGammaToLinear),
    DECL_NAPI_DESC(DrawingColorFilterCreateLuma),
    DECL_NAPI_DESC(DrawingColorFilterDestroy),
    DECL_NAPI_DESC(DrawingColorFilterCreateLighting),
    DECL_NAPI_DESC(DrawingColorSpaceCreateSrgb),
    DECL_NAPI_DESC(DrawingColorSpaceDestroy),
    DECL_NAPI_DESC(DrawingColorSpaceCreateSrgbLinear),
    DECL_NAPI_DESC(DrawingColorSetArgb),
    DECL_NAPI_DESC(DrawingFilterCreateDestroy),
    DECL_NAPI_DESC(DrawingFilterSetImageFilter),
    DECL_NAPI_DESC(DrawingFilterSetMaskFilter),
    DECL_NAPI_DESC(DrawingFilterSetColorFilter),
    DECL_NAPI_DESC(DrawingFontCreateDestroy),
    DECL_NAPI_DESC(DrawingFontSetBaselineSnap),
    DECL_NAPI_DESC(DrawingFontSetSubpixel),
    DECL_NAPI_DESC(DrawingFontSetForceAutoHinting),
    DECL_NAPI_DESC(DrawingFontSetTypeface),
    DECL_NAPI_DESC(DrawingFontSetTextSize),
    DECL_NAPI_DESC(DrawingFontCountText),
    DECL_NAPI_DESC(DrawingFontTextToGlyphs),
    DECL_NAPI_DESC(DrawingFontGetWidths),
    DECL_NAPI_DESC(DrawingFontGetTextPathWithFallback),
    DECL_NAPI_DESC(DrawingFontSetLinearText),
    DECL_NAPI_DESC(DrawingFontSetTextSkewX),
    DECL_NAPI_DESC(DrawingFontSetFakeBoldText),
    DECL_NAPI_DESC(DrawingFontSetScaleX),
    DECL_NAPI_DESC(DrawingFontSetHinting),
    DECL_NAPI_DESC(DrawingFontSetEmbeddedBitmaps),
    DECL_NAPI_DESC(DrawingFontSetEdging),
    DECL_NAPI_DESC(DrawingFontMeasureSingleCharacter),
    DECL_NAPI_DESC(DrawingFontMeasuretext),
    DECL_NAPI_DESC(DrawingFontArgumentsCreate),
    DECL_NAPI_DESC(DrawingFontArgumentsAddVariation),
    DECL_NAPI_DESC(DrawingFontArgumentsDestroy),
    DECL_NAPI_DESC(DrawingFontSetThemeFontFollowed),
    DECL_NAPI_DESC(DrawingFontIsThemeFontFollowed),
    DECL_NAPI_DESC(DrawingFontGetMetrics),
    DECL_NAPI_DESC(DrawingFontMeasureTextWithBrushOrPen),
    DECL_NAPI_DESC(DrawingFontGetWidthsBounds),
    DECL_NAPI_DESC(DrawingFontGetPos),
    DECL_NAPI_DESC(DrawingFontGetSpacing),
    DECL_NAPI_DESC(DrawingFontMeasureSingleChaWithFeatures),
    DECL_NAPI_DESC(DrawingFontFeatures),
    DECL_NAPI_DESC(DrawingGpuContext),
    DECL_NAPI_DESC(DrawingImageFilter),
    DECL_NAPI_DESC(DrawingImage),
    DECL_NAPI_DESC(DrawingMaskFilter),
    DECL_NAPI_DESC(DrawingMatrixCreate),
    DECL_NAPI_DESC(DrawingMatrixTransform),
    DECL_NAPI_DESC(DrawingMatrixOperation),
    DECL_NAPI_DESC(DrawingMatrixPart2Transform),
    DECL_NAPI_DESC(DrawingMatrixPart2MapQuery),
    DECL_NAPI_DESC(DrawingMatrixPart2Set),
    DECL_NAPI_DESC(DrawingBitmap),
    DECL_NAPI_DESC(DrawingBrushCreateDestroy),
    DECL_NAPI_DESC(DrawingBrushAntiAlias),
    DECL_NAPI_DESC(DrawingBrushColor),
    DECL_NAPI_DESC(DrawingBrushAlpha),
    DECL_NAPI_DESC(DrawingBrushShaderEffect),
    DECL_NAPI_DESC(DrawingBrushShadowLayer),
    DECL_NAPI_DESC(DrawingBrushFilter),
    DECL_NAPI_DESC(DrawingBrushBlendMode),
    DECL_NAPI_DESC(DrawingBrushReset),
    DECL_NAPI_DESC(DrawingBrushGetFloat),
    DECL_NAPI_DESC(DrawingBrushSetColor4f),
    DECL_NAPI_DESC(DrawingPenCreateDestroy),
    DECL_NAPI_DESC(DrawingPenAntiAlias),
    DECL_NAPI_DESC(DrawingPenColor),
    DECL_NAPI_DESC(DrawingPenAlpha),
    DECL_NAPI_DESC(DrawingPenWidth),
    DECL_NAPI_DESC(DrawingPenMiterLimit),
    DECL_NAPI_DESC(DrawingPenCap),
    DECL_NAPI_DESC(DrawingPenJoin),
    DECL_NAPI_DESC(DrawingPenEffects),
    DECL_NAPI_DESC(DrawingPenFilter),
    DECL_NAPI_DESC(DrawingPenBlendMode),
    DECL_NAPI_DESC(DrawingPenGetFillPath),
    DECL_NAPI_DESC(DrawingPenReset),
    DECL_NAPI_DESC(DrawingPenGetFloat),
    DECL_NAPI_DESC(DrawingPenSetColor4f),
    DECL_NAPI_DESC(DrawingPixelMap),
    DECL_NAPI_DESC(DrawingRectCreateDestroyIntersectJoin),
    DECL_NAPI_DESC(DrawingRectSetGetLeftTopRightBottom),
    DECL_NAPI_DESC(DrawingRectOtherOperations),
    DECL_NAPI_DESC(DrawingRoundRect),
    DECL_NAPI_DESC(DrawingSamplingOptions),
    DECL_NAPI_DESC(DrawingShadowLayer),
    DECL_NAPI_DESC(DrawingShaderEffectCreateGradient),
    DECL_NAPI_DESC(DrawingShaderEffectCreateSpecial),
    DECL_NAPI_DESC(DrawingShaderEffectDestroy),
    DECL_NAPI_DESC(DrawingSurface),
    DECL_NAPI_DESC(DrawingTextBlobBuilder),
    DECL_NAPI_DESC(DrawingTextBlobCreate),
    DECL_NAPI_DESC(DrawingTextBlobOther),
    DECL_NAPI_DESC(DrawingTypefaceCreate),
    // need fixed
    DECL_NAPI_DESC(DrawingRegionAdvancedOperations),
    DECL_NAPI_DESC(DrawingRegionPart2QueryOperations),
    DECL_NAPI_DESC(DrawingPathIterator),
    DECL_NAPI_DESC(DrawingPathPart4InverseFillType),
    DECL_NAPI_DESC(DrawingPathPart4GetData),
    DECL_NAPI_DESC(DrawingCanvasDrawPixelMapMesh),
    DECL_NAPI_DESC(DrawingCanvasResetClip),
    DECL_NAPI_DESC(DrawingLattice),
    DECL_NAPI_DESC(DrawingRectPart2OtherOperations),
    DECL_NAPI_DESC(DrawingTypefaceIsBoldItalic),
    DECL_NAPI_DESC(DrawingMatrixPart3),
    };

EXTERN_C_START static napi_value Init(napi_env env, napi_value exports)
{
    napi_define_properties(env,
                           exports,
                           sizeof(g_drawingNativeDescriptors) / sizeof(g_drawingNativeDescriptors[CASE_NUM_0]),
                           g_drawingNativeDescriptors);
    return exports;
}
EXTERN_C_END

static napi_module drawingNativeModule = {
    .nm_version = DRAWING_NUMBER_1,
    .nm_flags = 0,
    .nm_filename = nullptr,
    .nm_register_func = Init,
    .nm_modname = "drawingnative",
    .nm_priv = ((void*)0),
    .reserved = { 0 },
};

extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
{
    napi_module_register(&drawingNativeModule);
}