<?php
/**
 * Booking Repository Interface
 *
 * Interface for booking repository operations
 *
 * @package NemtlyBooking
 * @since   PBOOKING_SINCE
 */

namespace NemtlyBooking\Interfaces;

/**
 * Booking Repository Interface
 *
 * @since PBOOKING_SINCE
 */
interface Booking_Repository_Interface extends Repository_Interface {

    /**
     * Find bookings by event ID
     *
     * @since PBOOKING_SINCE
     *
     * @param int   $event_id Event ID.
     * @param array $args     Query arguments.
     *
     * @return array Array of booking objects.
     */
    public function find_by_event( $event_id, $args = [] );

    /**
     * Find bookings by user ID
     *
     * @since PBOOKING_SINCE
     *
     * @param int   $user_id User ID.
     * @param array $args    Query arguments.
     *
     * @return array Array of booking objects.
     */
    public function find_by_user( $user_id, $args = [] );

    /**
     * Find bookings by status
     *
     * @since PBOOKING_SINCE
     *
     * @param string $status Booking status.
     * @param array  $args   Query arguments.
     *
     * @return array Array of booking objects.
     */
    public function find_by_status( $status, $args = [] );

    /**
     * Count bookings for an event
     *
     * @since PBOOKING_SINCE
     *
     * @param int $event_id Event ID.
     *
     * @return int Booking count.
     */
    public function count_for_event( $event_id );

    /**
     * Count bookings by status
     *
     * @since PBOOKING_SINCE
     *
     * @param string $status Booking status.
     *
     * @return int Booking count.
     */
    public function count_by_status( $status );

    /**
     * Get booking statistics
     *
     * @since PBOOKING_SINCE
     *
     * @return array Statistics data.
     */
    public function get_statistics();

    /**
     * Find bookings by date range
     *
     * @since PBOOKING_SINCE
     *
     * @param string $start_date Start date.
     * @param string $end_date   End date.
     * @param array  $args       Query arguments.
     *
     * @return array Array of booking objects.
     */
    public function find_by_date_range( $start_date, $end_date, $args = [] );
}
