package chisel

import (
	"strconv"

	portainer "github.com/portainer/portainer/api"
)

// AddSchedule register a schedule inside the tunnel details associated to an endpoint.
func (service *Service) AddSchedule(endpointID portainer.EndpointID, schedule *portainer.EdgeSchedule) {
	tunnel := service.GetTunnelDetails(endpointID)

	existingScheduleIndex := -1
	for idx, existingSchedule := range tunnel.Schedules {
		if existingSchedule.ID == schedule.ID {
			existingScheduleIndex = idx
			break
		}
	}

	if existingScheduleIndex == -1 {
		tunnel.Schedules = append(tunnel.Schedules, *schedule)
	} else {
		tunnel.Schedules[existingScheduleIndex] = *schedule
	}

	key := strconv.Itoa(int(endpointID))
	service.tunnelDetailsMap.Set(key, tunnel)
}

// RemoveSchedule will remove the specified schedule from each tunnel it was registered with.
func (service *Service) RemoveSchedule(scheduleID portainer.ScheduleID) {
	for item := range service.tunnelDetailsMap.IterBuffered() {
		tunnelDetails := item.Val.(*portainer.TunnelDetails)

		updatedSchedules := make([]portainer.EdgeSchedule, 0)
		for _, schedule := range tunnelDetails.Schedules {
			if schedule.ID == scheduleID {
				continue
			}
			updatedSchedules = append(updatedSchedules, schedule)
		}

		tunnelDetails.Schedules = updatedSchedules
		service.tunnelDetailsMap.Set(item.Key, tunnelDetails)
	}
}