// SPDX-License-Identifier: GPL-3
pragma solidity 0.8.17;

contract PersonFavoriteNumbers {

    struct Person {
        string firstName;
        string lastName;
        uint8 age;
        uint256[] favoriteNumbers;
        bool isSet;
    }

    mapping(uint256 => Person) persons;

    function PersonExists(uint256 _personId) public view returns(bool) {
        return persons[_personId].isSet;
    }

    event PersonCreated(uint256 _personId, string _firstName, string _lastName, string msg);
 
    function addPerson(uint256 _personId, string memory _firstName, string memory _lastName, uint8 _age) public {
        require(!PersonExists(_personId), "This person already exists!");
        Person memory newPerson = Person(_firstName, _lastName, _age, new uint256[](0), true);
        persons[_personId] = newPerson;
        emit PersonCreated(_personId, _firstName, _lastName, "New Person Created");
    }

    function addFavoriteNumberToPerson(uint256 _number, uint256 _personId) public {
        require(PersonExists(_personId), "This person doesn't exist yet!");
        persons[_personId].favoriteNumbers.push(_number);
    }

    function getPersonFavoriteNumbers(uint256 _personId) public view returns (uint256[] memory) {
        require(PersonExists(_personId), "This person doesn't exist yet!");
        return persons[_personId].favoriteNumbers;
    }
}