package com.social.media.domain.campaign.valueobject;

import com.social.media.domain.shared.BaseValueObject;
import lombok.Value;

import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;

/**
 * Schedule Configuration Value Object
 * Encapsulates campaign scheduling parameters
 */
@Value
public class ScheduleConfiguration extends BaseValueObject {
    LocalDate startDate;
    LocalDate endDate;
    Integer dailyLimit;
    Integer hourlyLimit;
    Integer actionsPerHour;
    Integer delayBetweenActions; // in seconds
    WorkingHours workingHours;
    Randomization randomization;
    
    @Value
    public static class WorkingHours {
        Boolean enabled;
        LocalTime start;
        LocalTime end;
        List<Integer> workDays; // 1=Monday, 7=Sunday
    }
    
    @Value
    public static class Randomization {
        Boolean enabled;
        Integer minDelay; // in seconds
        Integer maxDelay; // in seconds
    }
    
    public static ScheduleConfiguration defaultConfig() {
        return new ScheduleConfiguration(
            null,
            null,
            100,
            10,
            5,
            60,
            new WorkingHours(true, LocalTime.of(9, 0), LocalTime.of(18, 0), List.of(1, 2, 3, 4, 5)),
            new Randomization(true, 30, 180)
        );
    }
    
    public boolean hasDateRange() {
        return startDate != null && endDate != null;
    }
    
    public boolean isWorkingHoursEnabled() {
        return workingHours != null && workingHours.enabled;
    }
    
    public boolean isRandomizationEnabled() {
        return randomization != null && randomization.enabled;
    }
    
    public boolean isWorkingDay(int dayOfWeek) {
        return workingHours == null || workingHours.workDays == null || 
               workingHours.workDays.contains(dayOfWeek);
    }
    
    public boolean isWithinWorkingHours(LocalTime time) {
        if (!isWorkingHoursEnabled()) {
            return true;
        }
        
        LocalTime start = workingHours.start;
        LocalTime end = workingHours.end;
        
        return time.isAfter(start) && time.isBefore(end);
    }
}
