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

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

/**
 * @title NFTArt
 * @dev ERC721 contract for the AI Artist Agent. Only the owner can mint.
 */
contract NFTArt is ERC721, ERC721URIStorage, Ownable {
    uint256 private _tokenCounter;

    event ArtMinted(address indexed to, uint256 indexed tokenId, string uri);

    constructor(address initialOwner) ERC721("AI Artist", "AIART") Ownable(initialOwner) {}

    /**
     * @dev Mint a new NFT with a metadata URI. Only callable by the owner (agent wallet).
     */
    function safeMint(address to, string memory uri) public onlyOwner returns (uint256) {
        uint256 tokenId = _tokenCounter;
        _tokenCounter++;
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
        emit ArtMinted(to, tokenId, uri);
        return tokenId;
    }

    /**
     * @dev Returns the total number of tokens minted.
     */
    function tokenCounter() public view returns (uint256) {
        return _tokenCounter;
    }

    // Required overrides
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}
