// SPDX-License-Identifier: MIT

/*
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB######BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB###BBGGGPPPP5PPPGGBBB####BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB#BBPYJ7!~~~^^^^^^^~~~~!!7?J5PGB##BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB#BPY7~~~~~~~~~~!!!!!!!!!!!!!~~~~!?YPB#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBGY7~~~~!!?JJJJJJJ??!!!!!!!!!7???????77YGBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB#BGBBY7!~!!!!!?BBBBBBBBBBJ!!!!!!7YBBBBBBBBG7!7JG#BBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBB#BBB#G7::??!!!!!!!777Y555YYYJJ?7!!!!!!7?JJYY55PPY7777?P#BBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBB#5~^7J^.^!???777777!!~~~~~~~~~~~!!!!!!!!~~~~~~!!!!!777775BBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBG~:^!!~7?7~^~!!777!!~~^^^^^^^^~~~!77!!7!~~~~~~~~~~~!!7777YBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBB#J^~!7~^7~::^:.:!777777?JY5PPPP5YJ???77777!7?J5PGGGPP5YJ?77P#BBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBJ~~~!~~77PGGPJ?PGGBB#&@@@@&&&&&@@&&#G55PGB#&@&&&&&&@@@&&#B#&#BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBB#Y~~~~~~?5555JYG&@@@@@@&##BBBBBBB##&@@@@@@@&#BBBBBBBB#&@@@@&B#BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBB#P~:::^!77??!^::~JY#@@@#BBBBBBBBBBBB#&@@&@@&BBBBBBBBBBBB&@@@5JBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBB#P^::::^~7!::^:^~??7Y@@@#BBBBBBBBBBBBB&@#P@@#BBBBBBBBBBB#&@@P7?GBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBB!::::^^~77~^^^7J?7775@@&#BBBBBBBBBB#&@&Y7G@&#BBBBBBBBB#&@&57??P#BBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBB#5~^^^^^~!?7777??777777YB@@&##BBBB##&@@BJ77?P&@&&#####&@@&GJ7???P#BBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBG?^^^^^~~7YYYJ?77777777777YG#@@@@@@@&#GJ777777?5B#&&&&&#B5J7?????P#BBBB###BBBBBBBBBBBBBBB
BBBBBBBBBBBB57~^::^~JB5Y?777777777777777?YY55YJ?7!!7777777777????77!77???77?GBBBBBPJJPBBBBBBBBBBBBBB
BBBBBBBBBBBB##BGP5JJYB5Y?77777????77!!!!!!!!!!!!!!!!!!!!!!!!!!!!!777???7777JBBBBBG!:.!BBBBBBBBBBBBBB
BBBBBBBBBBBBBBBB#####BPJJ?7777777777!!!!~~!!!!!7!7777!7777!77777777777!!!7?PBBBB#P!^:~GBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBYJJ?777!!!777777!!~77777?7777?7?YPGPY?7!7777?77777?YBBBBB#5!~^:?B####BBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBGYJJ?7777777??77!!~!~!!!7!!!!7!!!7JPB#PJ!7??77777?YBBBB##B?~~^:.^!?YPGBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBGYJJ?777777?????77!!!!!7!!!77!!!!!!7P&&GY?77777?YBBBBBPJJ!!~7~^:.  .:!PBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBG5JJ??7777777??J???777!!!!!!!!!77???5#&#P?77?JPBBBB#J.^!!!!77~^^:::::7BBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBPYJJ??77777777??JJJJJJJ????JJJJJJ?7Y##G5JJPBGPPPGG?~!~~!!77~^::^^^:~BBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBPYJJ???777777777?????????????????7JP55Y5PGPP5555P?~!~~~77~^^:^^^^7BBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBGPYJJ???????????????????????????J5GP555PGPPP55PP5YY??7^~~~~~~^^Y#BBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBGP5YJJ????????????????JJJYY5GBBBBGPPGGPPPPPPG###BG?^^:::::^?BBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBGGPP555555PPPPPGGGBBBB#BBBBBBGGGGPPPPPPBBBBBBGY?7!7?JPBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB##BBBBB#####BBBBBBBBBBBBBBBBBBBGGGPGBBBBBBBB##BBB###BBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
*/

pragma solidity ^0.8.20;

/// @title KerbitStore: A simple store smart contract
contract KerbitStore {
    address payable public owner;

    /// @dev Event emitted when a payment is received
    event PaymentReceived(
        address indexed buyer,
        uint256 totalAmountPaid,
        uint256[] itemIds,
        uint256[] quantities
    );

    /// @dev Event emitted when a withdrawal is made
    event Withdrawn(address indexed to, uint256 amount);

    /// @dev Sets the contract deployer as the owner
    constructor() {
        owner = payable(msg.sender);
    }

    /// @dev Modifier to restrict access to onlyOwner functions
    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can perform this action");
        _;
    }

    /// @notice Make a payment for purchasing items
    /// @param itemIds An array of itemIds that the user wants to purchase
    /// @param quantities An array of quantities corresponding to each itemId
    function makePayment(
        uint256[] memory itemIds,
        uint256[] memory quantities
    ) external payable {
        require(
            itemIds.length == quantities.length,
            "Item IDs and quantities must have the same length"
        );
        emit PaymentReceived(msg.sender, msg.value, itemIds, quantities);
    }

    /// @notice Withdraw the accumulated balance from the contract
    function withdraw() external onlyOwner {
        uint256 amount = address(this).balance;
        (bool success, ) = owner.call{value: amount}("");
        require(success, "Withdrawal failed");
        emit Withdrawn(owner, amount);
    }

    /// @dev A function to accept Ether transfers (payable)
    receive() external payable {}
}