package com.social.media.application.bot.dto;

import java.time.LocalDateTime;
import java.util.Map;
import java.util.Set;

/**
 * Response DTO for Bot operations
 */
public class BotResponseDto {
    
    private final String id;
    private final String companyId;
    private final String createdBy;
    private final String name;
    private final String description;
    private final String botType;
    private final String status;
    private final Map<String, Object> configuration;
    private final Set<String> targetSocialAccountIds;
    private final Set<String> targetUserListIds;
    private final LocalDateTime lastExecutionAt;
    private final LocalDateTime nextExecutionAt;
    private final int totalExecutions;
    private final int successfulExecutions;
    private final int failedExecutions;
    private final double successRate;
    private final double failureRate;
    private final LocalDateTime createdAt;
    private final LocalDateTime updatedAt;
    
    private BotResponseDto(Builder builder) {
        this.id = builder.id;
        this.companyId = builder.companyId;
        this.createdBy = builder.createdBy;
        this.name = builder.name;
        this.description = builder.description;
        this.botType = builder.botType;
        this.status = builder.status;
        this.configuration = builder.configuration;
        this.targetSocialAccountIds = builder.targetSocialAccountIds;
        this.targetUserListIds = builder.targetUserListIds;
        this.lastExecutionAt = builder.lastExecutionAt;
        this.nextExecutionAt = builder.nextExecutionAt;
        this.totalExecutions = builder.totalExecutions;
        this.successfulExecutions = builder.successfulExecutions;
        this.failedExecutions = builder.failedExecutions;
        this.successRate = builder.successRate;
        this.failureRate = builder.failureRate;
        this.createdAt = builder.createdAt;
        this.updatedAt = builder.updatedAt;
    }
    
    public static Builder builder() {
        return new Builder();
    }
    
    // Getters
    public String getId() { return id; }
    public String getCompanyId() { return companyId; }
    public String getCreatedBy() { return createdBy; }
    public String getName() { return name; }
    public String getDescription() { return description; }
    public String getBotType() { return botType; }
    public String getStatus() { return status; }
    public Map<String, Object> getConfiguration() { return configuration; }
    public Set<String> getTargetSocialAccountIds() { return targetSocialAccountIds; }
    public Set<String> getTargetUserListIds() { return targetUserListIds; }
    public LocalDateTime getLastExecutionAt() { return lastExecutionAt; }
    public LocalDateTime getNextExecutionAt() { return nextExecutionAt; }
    public int getTotalExecutions() { return totalExecutions; }
    public int getSuccessfulExecutions() { return successfulExecutions; }
    public int getFailedExecutions() { return failedExecutions; }
    public double getSuccessRate() { return successRate; }
    public double getFailureRate() { return failureRate; }
    public LocalDateTime getCreatedAt() { return createdAt; }
    public LocalDateTime getUpdatedAt() { return updatedAt; }
    
    public static class Builder {
        private String id;
        private String companyId;
        private String createdBy;
        private String name;
        private String description;
        private String botType;
        private String status;
        private Map<String, Object> configuration;
        private Set<String> targetSocialAccountIds;
        private Set<String> targetUserListIds;
        private LocalDateTime lastExecutionAt;
        private LocalDateTime nextExecutionAt;
        private int totalExecutions;
        private int successfulExecutions;
        private int failedExecutions;
        private double successRate;
        private double failureRate;
        private LocalDateTime createdAt;
        private LocalDateTime updatedAt;
        
        public Builder id(String id) { this.id = id; return this; }
        public Builder companyId(String companyId) { this.companyId = companyId; return this; }
        public Builder createdBy(String createdBy) { this.createdBy = createdBy; return this; }
        public Builder name(String name) { this.name = name; return this; }
        public Builder description(String description) { this.description = description; return this; }
        public Builder botType(String botType) { this.botType = botType; return this; }
        public Builder status(String status) { this.status = status; return this; }
        public Builder configuration(Map<String, Object> configuration) { this.configuration = configuration; return this; }
        public Builder targetSocialAccountIds(Set<String> targetSocialAccountIds) { this.targetSocialAccountIds = targetSocialAccountIds; return this; }
        public Builder targetUserListIds(Set<String> targetUserListIds) { this.targetUserListIds = targetUserListIds; return this; }
        public Builder lastExecutionAt(LocalDateTime lastExecutionAt) { this.lastExecutionAt = lastExecutionAt; return this; }
        public Builder nextExecutionAt(LocalDateTime nextExecutionAt) { this.nextExecutionAt = nextExecutionAt; return this; }
        public Builder totalExecutions(int totalExecutions) { this.totalExecutions = totalExecutions; return this; }
        public Builder successfulExecutions(int successfulExecutions) { this.successfulExecutions = successfulExecutions; return this; }
        public Builder failedExecutions(int failedExecutions) { this.failedExecutions = failedExecutions; return this; }
        public Builder successRate(double successRate) { this.successRate = successRate; return this; }
        public Builder failureRate(double failureRate) { this.failureRate = failureRate; return this; }
        public Builder createdAt(LocalDateTime createdAt) { this.createdAt = createdAt; return this; }
        public Builder updatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; return this; }
        
        public BotResponseDto build() {
            return new BotResponseDto(this);
        }
    }
}

