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

import {CheckpointExtensionBase} from "./CheckpointExtensionBase.sol";
import {CheckpointStorage} from "../storage/CheckpointStorage.sol";

/// @notice Stub for future SNARK verifier — currently checks optional proof hash commitment.
contract ZkStateRootVerifierExtension is CheckpointExtensionBase {
    mapping(bytes32 => bool) public acceptedProofHashes;
    bool public requireZkProof;

    event ZkProofRegistered(bytes32 indexed proofHash);

    function HOOK_BEFORE_SUBMIT() external pure override returns (uint32) {
        return 1 << 0;
    }

    function HOOK_AFTER_SUBMIT() external pure override returns (uint32) {
        return 0;
    }

    function HOOK_ON_CCIP() external pure override returns (uint32) {
        return 0;
    }

    function registerProofHash(bytes32 proofHash) external {
        acceptedProofHashes[proofHash] = true;
        emit ZkProofRegistered(proofHash);
    }

    function setRequireZkProof(bool required) external {
        requireZkProof = required;
    }

    function beforeSubmit(CheckpointStorage.CheckpointHeader calldata header, bytes calldata data) external view {
        if (!requireZkProof) return;
        bytes32 proofHash = abi.decode(data, (bytes32));
        require(acceptedProofHashes[proofHash], "zk proof");
        require(proofHash != bytes32(0), "zero proof");
        require(header.stateRoot != bytes32(0), "state root");
    }

    function afterSubmit(CheckpointStorage.CheckpointHeader calldata, bytes calldata) external pure override {}

    function onCCIPReceive(bytes calldata) external pure override {}
}
