// SPDX-License-Identifier: MIT

pragma solidity ^0.8.17;

import "./TestBase.sol";
import {TestConstants} from "./Constants.sol";

contract Test_FleekERC721_GetToken is Test_FleekERC721_Base {
    uint256 internal tokenId;

    function setUp() public {
        baseSetUp();
        tokenId = mintDefault(deployer);
    }

    function test_getToken() public {
        (
            string memory name,
            string memory description,
            string memory externalURL,
            string memory ens,
            uint256 currentBuild,
            string memory logo,
            uint24 color
        ) = CuT.getToken(tokenId);
        assertEq(name, TestConstants.APP_NAME);
        assertEq(description, TestConstants.APP_DESCRIPTION);
        assertEq(externalURL, TestConstants.APP_EXTERNAL_URL);
        assertEq(logo, TestConstants.LOGO_0);
        assertEq(color, TestConstants.APP_COLOR);
        assertEq(ens, TestConstants.APP_ENS);
        assertEq(currentBuild, 0);
    }

    function testFuzz_getTokenAfterUpdate(
        string memory newAppName,
        string memory newDescription,
        string memory newExternalURL,
        string memory newENS,
        string memory newCommitHash,
        string memory newRepository,
        string memory newLogo,
        uint24 newColor
    ) public {
        CuT.setTokenName(tokenId, newAppName);
        CuT.setTokenDescription(tokenId, newDescription);
        CuT.setTokenExternalURL(tokenId, newExternalURL);
        transferENS(newENS, deployer);
        CuT.setTokenENS(tokenId, newENS);
        CuT.setTokenBuild(tokenId, newCommitHash, newRepository);
        CuT.setTokenLogoAndColor(tokenId, newLogo, newColor);

        (
            string memory name,
            string memory description,
            string memory externalURL,
            string memory ens,
            uint256 currentBuild,
            string memory logo,
            uint24 color
        ) = CuT.getToken(tokenId);
        assertEq(name, newAppName);
        assertEq(description, newDescription);
        assertEq(externalURL, newExternalURL);
        assertEq(logo, newLogo);
        assertEq(color, newColor);
        assertEq(ens, newENS);
        assertEq(currentBuild, 1);
    }

    function testFuzz_getTokenForDifferentAddresses(address account) public {
        vm.prank(account);
        CuT.getToken(tokenId);
    }

    function testFuzz_tokenURIForNonExistentId(uint256 _tokenId) public {
        vm.assume(_tokenId != tokenId);
        expectRevertWithInvalidTokenId();
        CuT.getToken(_tokenId);
    }
}
