function cancelEvent(uint256 eventId) external returns (bool){ require(eventExists[eventId], "Event does not exist"); require(events[eventId].eventstatus != Status.CLOSED, "Event is closed"); require(events[eventId].eventHost == msg.sender, "Only event host can cancel the event");
// check event balance before cancelling and refunding
require(eventBalance[eventId] > 0, "Event balance is zero or negative");
// cancel the event
events[eventId].eventstatus = Status.CANCELED;
emit eventCancelled(eventId);
// transfer funds to ticket holders
for (uint256 i = 0; i < eventToTicketIds[eventId].length; i++) {
uint256 ticketId = eventToTicketIds[eventId][i];
uint ticketQty = tickets[ticketId].ticketQty;
address payable ticketHolder = payable(ticketHolders[ticketId]);
uint refundAmount = ticketQty * events[eventId].ticketPrice;
// transfer refund amount and update ticket and event balance
if (eventBalance[eventId] >= refundAmount) {
eventBalance[eventId] -= refundAmount;
payOut(ticketHolder, refundAmount);
// shift remaining tickets left and delete refunded ticket
uint256[] storage holderTicketIds = buyerToTicketIds[ticketHolder];
for (uint256 j = 0; j < holderTicketIds.length; j++) {
if (holderTicketIds[j] == ticketId) {
for (uint256 k = j; k < holderTicketIds.length - 1; k++) {
holderTicketIds[k] = holderTicketIds[k+1];
}
holderTicketIds.pop();
break;
}
}
tickets[ticketId].ticketstatus = TicketStatus.Refunded;
emit ticketRefunded(ticketHolder, eventId, ticketId, refundAmount);
}
}
delete eventToTicketIds[eventId];
delete events[eventId];
eventExists[eventId] = false;
return true;
}