/*
 * Copyright (c) 2024-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.
 */
package arkui.Graphics;

import ohos.graphics.drawing.default as drawing;
import ohos.graphics.common2D.default as common2D;
import global.resource.Resource as Resource;
import arkui.component.enums.BorderStyle as BorderStyle;
import arkui.component.units.ResourceColor as ResourceColor;
import arkui.component.units.Edges as Edges;
import arkui.component.units.BorderRadiuses as BorderRadiuses;

interface Size {
    attribute number width;
    attribute number height;
};
[Entity=Class]
interface DrawContext {
    constructor();
    Size size();
    Size sizeInPixel();
    drawing.Canvas canvas();
};
interface Vector2 {
    attribute number x;
    attribute number y;
};
[TypeParameters="T = void"]
interface Vector2T {
    attribute number x;
    attribute number y;
};
interface Vector3 {
    attribute number x;
    attribute number y;
    attribute number z;
};
[Synthetic, Entity=Tuple]
interface Matrix4 {
    attribute number value0;
    attribute number value1;
    attribute number value2;
    attribute number value3;
    attribute number value4;
    attribute number value5;
    attribute number value6;
    attribute number value7;
    attribute number value8;
    attribute number value9;
    attribute number value10;
    attribute number value11;
    attribute number value12;
    attribute number value13;
    attribute number value14;
    attribute number value15;
};
typedef Offset = Vector2;
typedef Position = Vector2;
[TypeParametersDefaults="void"]
typedef <T> PositionT = Vector2T<T>;
typedef Pivot = Vector2;
typedef Scale = Vector2;
typedef Translation = Vector2;
typedef Rotation = Vector3;
interface Frame {
    attribute number x;
    attribute number y;
    attribute number width;
    attribute number height;
};
dictionary LengthUnit {
    number PX = 0;
    number VP = 1;
    number FP = 2;
    number PERCENT = 3;
    number LPX = 4;
};
[TypeParameters="T", TypeParametersDefaults="void"]
interface SizeT {
    attribute number width;
    attribute number height;
};
dictionary LengthMetricsUnit {
    number DEFAULT = 0;
    number PX = 1;
};
[Entity=Class]
interface LengthMetrics {
    constructor(number value, LengthUnit unit);
    attribute LengthUnit unit;
    attribute number value;
    static LengthMetrics px(number value);
    static LengthMetrics vp(number value);
    static LengthMetrics fp(number value);
    static LengthMetrics percent(number value);
    static LengthMetrics lpx(number value);
    static LengthMetrics resource(Resource value);
};
[Entity=Class]
interface ColorMetrics {
    constructor();
    static ColorMetrics numeric(number value);
    static ColorMetrics rgba(number red, number green, number blue, number alpha);
    static ColorMetrics resourceColor(ResourceColor color);
    ColorMetrics blendColor(ColorMetrics overlayColor);
    String color();
    number red();
    number green();
    number blue();
    number alpha();
};
interface Corners {
    attribute number topLeft;
    attribute number topRight;
    attribute number bottomLeft;
    attribute number bottomRight;
};
typedef Rect = common2D.Rect;
// fixme
interface CornerRadius {};
interface RoundRect {
    attribute common2D.Rect rect;
    attribute CornerRadius corners;
};
interface Circle {
    attribute number centerX;
    attribute number centerY;
    attribute number radius;
};
interface CommandPath {
    attribute String commands;
};
[Entity=Class]
interface ShapeMask {
    constructor();
    attribute number fillColor;
    attribute number strokeColor;
    attribute number strokeWidth;
    void setRectShape(common2D.Rect rect);
    void setRoundRectShape(RoundRect roundRect);
    void setCircleShape(Circle circle);
    void setOvalShape(common2D.Rect oval);
    void setCommandPath(CommandPath path);
};
[Entity=Class]
interface ShapeClip {
    constructor();
    void setRectShape(common2D.Rect rect);
    void setRoundRectShape(RoundRect roundRect);
    void setCircleShape(Circle circle);
    void setOvalShape(common2D.Rect oval);
    void setCommandPath(CommandPath path);
};
typedef Corners NodeBorderRadiuses;
Edges edgeColors(number all);
Edges edgeWidths(number all);
Edges borderStyles(BorderStyle all);
BorderRadiuses borderRadiuses(number all);