-- Copyright (c) 2026 Huawei Technologies Co., Ltd.
-- openUBMC is licensed under Mulan PSL v2.
-- You can use this software according to the terms and conditions of the Mulan PSL v2.
-- You may obtain a copy of Mulan PSL v2 at:
--          http://license.coscl.org.cn/MulanPSL2
-- THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
-- EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
-- MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
-- See the Mulan PSL v2 for more details.

local validate = require 'mc.validate'
local utils = require 'mc.utils'

local MEndpoint = {}

---@class MEndpoint.RetryDelaySecond
---@field RetryDelaySecond integer
local TRetryDelaySecond = {}
TRetryDelaySecond.__index = TRetryDelaySecond
TRetryDelaySecond.group = {}

local function TRetryDelaySecond_from_obj(obj)
    return setmetatable(obj, TRetryDelaySecond)
end

function TRetryDelaySecond.new(RetryDelaySecond)
    return TRetryDelaySecond_from_obj({RetryDelaySecond = RetryDelaySecond or 10})
end
---@param obj MEndpoint.RetryDelaySecond
function TRetryDelaySecond:init_from_obj(obj)
    self.RetryDelaySecond = obj.RetryDelaySecond or 10
end

function TRetryDelaySecond:remove_error_props(errs, obj)
    utils.remove_obj_error_property(obj, errs, TRetryDelaySecond.group)
end

TRetryDelaySecond.from_obj = TRetryDelaySecond_from_obj

TRetryDelaySecond.proto_property = {'RetryDelaySecond'}

TRetryDelaySecond.default = {0}

TRetryDelaySecond.struct = {{name = 'RetryDelaySecond', is_array = false, struct = nil}}

function TRetryDelaySecond:validate(prefix, errs, need_convert)
    prefix = prefix or ''

    validate.Optional(prefix .. 'RetryDelaySecond', self.RetryDelaySecond, 'uint32', false, errs, need_convert)

    TRetryDelaySecond:remove_error_props(errs, self)
    validate.CheckUnknowProperty(self, TRetryDelaySecond.proto_property, errs, need_convert)
    return self
end

function TRetryDelaySecond:unpack(_)
    return self.RetryDelaySecond
end

MEndpoint.RetryDelaySecond = TRetryDelaySecond

---@class MEndpoint.RetryLimit
---@field RetryLimit integer
local TRetryLimit = {}
TRetryLimit.__index = TRetryLimit
TRetryLimit.group = {}

local function TRetryLimit_from_obj(obj)
    return setmetatable(obj, TRetryLimit)
end

function TRetryLimit.new(RetryLimit)
    return TRetryLimit_from_obj({RetryLimit = RetryLimit or 0})
end
---@param obj MEndpoint.RetryLimit
function TRetryLimit:init_from_obj(obj)
    self.RetryLimit = obj.RetryLimit or 0
end

function TRetryLimit:remove_error_props(errs, obj)
    utils.remove_obj_error_property(obj, errs, TRetryLimit.group)
end

TRetryLimit.from_obj = TRetryLimit_from_obj

TRetryLimit.proto_property = {'RetryLimit'}

TRetryLimit.default = {0}

TRetryLimit.struct = {{name = 'RetryLimit', is_array = false, struct = nil}}

function TRetryLimit:validate(prefix, errs, need_convert)
    prefix = prefix or ''

    validate.Optional(prefix .. 'RetryLimit', self.RetryLimit, 'uint32', false, errs, need_convert)

    TRetryLimit:remove_error_props(errs, self)
    validate.CheckUnknowProperty(self, TRetryLimit.proto_property, errs, need_convert)
    return self
end

function TRetryLimit:unpack(_)
    return self.RetryLimit
end

MEndpoint.RetryLimit = TRetryLimit

---@class MEndpoint.PowerState
---@field PowerState integer
local TPowerState = {}
TPowerState.__index = TPowerState
TPowerState.group = {}

local function TPowerState_from_obj(obj)
    return setmetatable(obj, TPowerState)
end

function TPowerState.new(PowerState)
    return TPowerState_from_obj({PowerState = PowerState or 255})
end
---@param obj MEndpoint.PowerState
function TPowerState:init_from_obj(obj)
    self.PowerState = obj.PowerState or 255
end

function TPowerState:remove_error_props(errs, obj)
    utils.remove_obj_error_property(obj, errs, TPowerState.group)
end

TPowerState.from_obj = TPowerState_from_obj

TPowerState.proto_property = {'PowerState'}

TPowerState.default = {0}

TPowerState.struct = {{name = 'PowerState', is_array = false, struct = nil}}

function TPowerState:validate(prefix, errs, need_convert)
    prefix = prefix or ''

    validate.Optional(prefix .. 'PowerState', self.PowerState, 'uint8', false, errs, need_convert)

    TPowerState:remove_error_props(errs, self)
    validate.CheckUnknowProperty(self, TPowerState.proto_property, errs, need_convert)
    return self
end

function TPowerState:unpack(_)
    return self.PowerState
end

MEndpoint.PowerState = TPowerState

---@class MEndpoint.RefChip
---@field RefChip integer[]
local TRefChip = {}
TRefChip.__index = TRefChip
TRefChip.group = {}

local function TRefChip_from_obj(obj)
    return setmetatable(obj, TRefChip)
end

function TRefChip.new(RefChip)
    return TRefChip_from_obj({RefChip = RefChip})
end
---@param obj MEndpoint.RefChip
function TRefChip:init_from_obj(obj)
    self.RefChip = obj.RefChip
end

function TRefChip:remove_error_props(errs, obj)
    utils.remove_obj_error_property(obj, errs, TRefChip.group)
end

TRefChip.from_obj = TRefChip_from_obj

TRefChip.proto_property = {'RefChip'}

TRefChip.default = {{}}

TRefChip.struct = {{name = 'RefChip', is_array = true, struct = nil}}

function TRefChip:validate(prefix, errs, need_convert)
    prefix = prefix or ''

    validate.OptionalArray(prefix .. 'RefChip', self.RefChip, 'uint8', false, errs, need_convert)

    TRefChip:remove_error_props(errs, self)
    validate.CheckUnknowProperty(self, TRefChip.proto_property, errs, need_convert)
    return self
end

function TRefChip:unpack(_)
    return self.RefChip
end

MEndpoint.RefChip = TRefChip

return MEndpoint