// SPDX-License-Identifier: MIT

pragma solidity ^0.8.17;

import "forge-std/Test.sol";
import {FleekERC721} from "contracts/FleekERC721.sol";
import {TestConstants} from "./Constants.sol";

abstract contract Test_FleekERC721_Assertions is Test {
    function expectRevertWithTokenRole() public {
        vm.expectRevert("FleekAccessControl: must have token role");
    }

    function expectRevertWithCollectionRole() public {
        vm.expectRevert("FleekAccessControl: must have collection role");
    }

    function expectRevertWithAPAlreadyExists() public {
        vm.expectRevert("FleekERC721: AP already exists");
    }

    function expectRevertWithMustBeAPOwner() public {
        vm.expectRevert("FleekERC721: must be AP owner");
    }

    function expectRevertWithInvalidAP() public {
        vm.expectRevert("FleekERC721: invalid AP");
    }

    function expectRevertWithMinimalScore() public {
        vm.expectRevert("FleekERC721: score cant be lower");
    }

    function expectRevertWithInvalidTokenId() public {
        vm.expectRevert("ERC721: invalid token ID");
    }
}

abstract contract Test_FleekERC721_Base is Test, Test_FleekERC721_Assertions {
    FleekERC721 internal CuT; // Contract Under Test
    address internal deployer;

    function baseSetUp() internal {
        CuT = new FleekERC721();
        CuT.initialize("Test Contract", "FLKAPS");
        deployer = address(this);
    }

    function mintDefault(address to) internal returns (uint256) {
        uint256 mint = CuT.mint(
            to,
            TestConstants.APP_NAME,
            TestConstants.APP_DESCRIPTION,
            TestConstants.APP_EXTERNAL_URL,
            TestConstants.APP_ENS,
            TestConstants.APP_COMMIT_HASH,
            TestConstants.APP_GIT_REPOSITORY,
            TestConstants.LOGO_0,
            TestConstants.APP_COLOR
        );

        return mint;
    }
}
