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

import {Test} from "forge-std/Test.sol";
import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import {Chain138MainnetCheckpoint} from "../../contracts/mainnet-checkpoint/Chain138MainnetCheckpoint.sol";
import {CheckpointStorage} from "../../contracts/mainnet-checkpoint/storage/CheckpointStorage.sol";
import {CheckpointLeaf} from "../../contracts/mainnet-checkpoint/libraries/CheckpointLeaf.sol";
import {CheckpointFlags} from "../../contracts/mainnet-checkpoint/libraries/CheckpointFlags.sol";
import {CheckpointHubConfig} from "../../contracts/mainnet-checkpoint/libraries/CheckpointHubConfig.sol";
import {CheckpointErrors} from "../../contracts/mainnet-checkpoint/libraries/CheckpointErrors.sol";

contract MinPaymentValueTest is Test {
    Chain138MainnetCheckpoint hub;
    address admin = address(0xA11CE);
    address submitter = address(0xB0B);

    function setUp() public {
        Chain138MainnetCheckpoint impl = new Chain138MainnetCheckpoint();
        hub = Chain138MainnetCheckpoint(
            address(new ERC1967Proxy(address(impl), abi.encodeCall(Chain138MainnetCheckpoint.initialize, (admin, address(1), uint64(1), address(0)))))
        );
        vm.startPrank(admin);
        hub.grantRole(hub.SUBMITTER_ROLE(), submitter);
        CheckpointHubConfig.HubConfig memory cfg = CheckpointHubConfig.mainnetDefaults();
        cfg.enforcePreviousBatchId = false;
        cfg.requireValidatorSigs = false;
        cfg.minPaymentValueWei = 1 ether;
        hub.applyConfig(cfg);
        vm.stopPrank();
    }

    function testRevertsBelowMinInExtensionData() public {
        CheckpointLeaf.PaymentLeafV1[] memory leaves = new CheckpointLeaf.PaymentLeafV1[](1);
        leaves[0] = CheckpointLeaf.PaymentLeafV1({
            txHash: keccak256("low"),
            from: address(1),
            to: address(2),
            value: 1,
            blockNumber: 1,
            blockTimestamp: 1,
            gasUsed: 1,
            success: true
        });
        bytes32 root = CheckpointLeaf.paymentLeafV1(138, leaves[0]);
        CheckpointStorage.CheckpointHeader memory header = CheckpointStorage.CheckpointHeader({
            batchId: 1,
            previousBatchId: 0,
            chainId: 138,
            checkpointBlock: 1,
            startBlock: 1,
            endBlock: 1,
            blockHash: keccak256("h"),
            stateRoot: keccak256("s"),
            paymentsRoot: root,
            receiptsRoot: bytes32(0),
            txCount: 1,
            flags: CheckpointFlags.PARTIAL_BATCH,
            submittedAt: 0,
            submitter: address(0),
            contentURI: bytes32(0)
        });
        vm.prank(submitter);
        vm.expectRevert(CheckpointErrors.BelowMinPayment.selector);
        hub.submitCheckpointCommitment(header, hex"01", bytes32(0), abi.encode(leaves));
    }
}
