// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/access/AccessControl.sol";
import "./interfaces/IM00MainnetBridgeFacet.sol";

/**
 * @title M00DiamondInit
 * @notice diamondCut _init delegatecall: bootstrap bridge ACL on diamond storage, then wire config.
 */
contract M00DiamondInit is AccessControl {
    bytes32 public constant BRIDGE_OPERATOR_ROLE = keccak256("BRIDGE_OPERATOR_ROLE");
    bytes32 public constant MIRROR_RELAYER_ROLE = keccak256("MIRROR_RELAYER_ROLE");
    bytes32 public constant INSTRUMENT_ADMIN_ROLE = keccak256("INSTRUMENT_ADMIN_ROLE");
    bytes32 public constant DOCUMENT_ADMIN_ROLE = keccak256("DOCUMENT_ADMIN_ROLE");
    bytes32 public constant STANDARDS_ADMIN_ROLE = keccak256("STANDARDS_ADMIN_ROLE");

    function init(IM00MainnetBridgeFacet.BridgeConfig calldata cfg, address governance) external {
        address grantee = governance == address(0) ? msg.sender : governance;
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(DEFAULT_ADMIN_ROLE, grantee);
        _grantRole(DEFAULT_ADMIN_ROLE, address(this));
        _grantRole(BRIDGE_OPERATOR_ROLE, grantee);
        _grantRole(MIRROR_RELAYER_ROLE, grantee);
        _grantRole(INSTRUMENT_ADMIN_ROLE, grantee);
        _grantRole(DOCUMENT_ADMIN_ROLE, grantee);
        _grantRole(STANDARDS_ADMIN_ROLE, grantee);
        IM00MainnetBridgeFacet(address(this)).wireMainnetBridge(cfg);
    }
}
