public bool Accept(
            IReservation[] reservations, IReservation candidate,
            ITable[] tables, TimeSpan seatingDuration)
        {
            var sameDayReservations = new SameIntervalReservationFilter()
                                      .Filter(reservations, candidate,
                                              seatingDuration);

            var assignedTables = new AlternativeConfigurationsTableAssigner()
                                 .Assign(sameDayReservations, tables);

            var leftTables = tables.Except(assignedTables);

            var leftTblsGroups = new TableConfigurationsGenerator()
                                 .Generate(leftTables);

            return(leftTblsGroups.Any(t => candidate.CanFit(t)));
        }
        private IEnumerable <ITable> AssignAlternativeConfiguration(
            IReservation reservation, IEnumerable <ITable> tables)
        {
            var rectangularTables = tables.Where(t => t is RectangularTable);

            var alternativeConfigs = new TableConfigurationsGenerator()
                                     .Generate(rectangularTables);

            // choose a configuration
            var assignedTbl = AssignTable(reservation, alternativeConfigs);

            if (assignedTbl == null ||
                !(assignedTbl is TableGroup assignedTblGroup))
            {
                return(new ITable[0]);
            }

            // return the selected tables in that configuration
            return(assignedTblGroup);
        }