/*
 * 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.
 */

#include "ina.h"
#include <mc/exception.h>
#include <mc/log.h>

using namespace dev;

bool ina_object::init(mc::mutable_dict& csr_object, const mc::dict&)
{
    try {
        // 查找并绑定内部件(空检查 → find_object → 器件类型白名单校验 → set_class_name),
        // 与 CSR1 的 bind_internal_chip 同一入口;内部件由 ChipObjectBase::m_chip_holder 保活
        dev::chip_base* base_chip = nullptr;
        if (!bind_internal_chip(csr_object, base_chip, "Ina")) {
            return false;
        }

        // 白名单已校验器件类型(matches_expected_chip_type 内 dynamic_cast<chip_ina*>),
        // base_chip 实为 chip_ina*。此处暂存,init 末尾与 trace_chip 一起显式赋值给接口。
        dev::chip_ina* ina_chip = static_cast<dev::chip_ina*>(base_chip);

        // 默认属性初始化(与 CSR1 initialize_default_properties 同序):
        // 灌入接口属性 → 可访问性回调 → host bus 订阅 → 访问看门狗。
        // 访问状态 ChipAccessState 由 Interface_Chip 构造函数创建,此处不再重复创建。
        initialize_default_properties(m_interface_chip, csr_object);

        // 加载 Ina 私有属性(ChipModel / PowerMultiplier / PowerDivisor /
        // ConfigurationRegister / CalibrationRegister)
        // 对齐 CSR1 from_csr 的容错策略:配置字段缺失时不抛异常,保持当前值
        m_interface_ina.from_variant(csr_object);

        // 接口指针赋值(对应 CSR1 bind_chip 之后的部分;BitIO/BlockIO 已并入 Interface_Chip)
        m_interface_trace_chip.m_chip = base_chip;
        // 内部件指针交给 Interface_Ina 作为后续"接口属性下发到内部件"的钩子
        // (当前未读取,见 i_ina.h 注释)
        m_interface_ina.m_chip_ina = ina_chip;
    } catch (const std::exception& e) {
        elog("Ina init failed, exception: ${exception}", ("exception", e.what()));
        return false;
    }

    return true;
}

bool ina_object::start()
{
    // Ina 器件无需上电复位(与 Pca9544 的 5s 复位不同),直接返回成功
    return true;
}

void ina_object::stop()
{
    // Ina 器件无在途计时器,stop 无需处理
}

std::string ina_object::dump()
{
    try {
        if (m_chip_holder == nullptr) {
            elog("ina device not initialized");
            return "";
        }

        auto result = m_chip_holder->dump();
        ilog("ina dump successfully");
        return result;
    } catch (const std::exception& e) {
        elog("ina device dump exception: ${error}", ("error", e.what()));
        return "";
    }
}

MC_REFLECT(dev::ina_object, ((m_interface_chip, "bmc.dev.Chip"))((m_interface_ina, "bmc.dev.Chip.PowerMeter.Ina"))(
                                (m_interface_trace_chip, "bmc.kepler.Release.TraceChip")))