contract FlyLegion is ERC721Enumerable, Ownable {
    using Strings for uint256;

    string public baseURI;
    string private constant baseExtension = ".json";
    uint256 private cost = 0.025 ether;
    uint256 public constant maxSupply = 7500;
    uint256 public constant maxMintAmount = 40;
    bool public paused = false;
    
    constructor(string memory _initBaseURI)ERC721("FlyLegion","FLYL"){
        setBaseURI(_initBaseURI);
    }
        
    mapping (uint256 => string) private _tokenURIs; // Optional mapping for token URIs
    //internal
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }
    
    
    function mint(address _to, uint256 _mintAmount) public payable{
        uint256 supply = totalSupply();
        require(!paused,"Sale is not active" );
        require(_mintAmount >0, "Mint amount must be greater than zero");
        require(_mintAmount <= maxMintAmount, "Exceeding maximum tokens that can be purchased in a single transaction");
        require(supply + _mintAmount <= maxSupply, "Exceeding maximum tokens available for purchase");
        
        if(msg.sender != owner()) {
            require(msg.value >= cost*_mintAmount , "Ether value is incorrect");
        }
        for (uint256 i = 1; i<=_mintAmount;i++){
          _safeMint(_to,supply + i);  
        }
    }
    

    function walletOfOwner(address _owner)public view returns(uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for(uint256 i; i<ownerTokenCount;i++){
            tokenIds[i]=tokenOfOwnerByIndex(_owner,i);
        }
        return tokenIds;
    }
    
     function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString(),baseExtension));
       
        
    }
    

    function getCost() public view returns (uint256){
        return cost;
    }
    
    function setBaseURI(string memory _newBaseURI)public onlyOwner{
        baseURI=_newBaseURI;
    }
    
    function pause(bool _state)public onlyOwner{
        paused = _state;
    }
    
    function withdraw() public payable onlyOwner{
        require(payable(msg.sender).send(address(this).balance));
    }
    
}
function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
}

// Optional mapping for token URIs
//internal