package kz.konturai.parser.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import kz.konturai.parser.model.AnalysisType;
import kz.konturai.parser.model.DetailLevel;
import kz.konturai.parser.validator.ValidAnalysisType;
import kz.konturai.parser.validator.ValidDetailLevel;
import kz.konturai.parser.validator.ValidRegion;
import kz.konturai.parser.validator.ValidTargetAudience;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Map;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MarketingAnalysisRequest {

    @NotBlank(message = "Поле 'businessNiche' обязательно для заполнения")
    @Size(min = 3, max = 200, message = "Поле 'businessNiche' должно содержать от 3 до 200 символов")
    @Pattern(regexp = "^[\\p{L}\\p{N}\\s\\-,]+$", message = "Поле 'businessNiche' содержит недопустимые символы")
    private String businessNiche;

    @NotBlank(message = "Поле 'product' обязательно для заполнения")
    @Size(min = 3, max = 200, message = "Поле 'product' должно содержать от 3 до 200 символов")
    @Pattern(regexp = "^[\\p{L}\\p{N}\\s\\-,]+$", message = "Поле 'product' содержит недопустимые символы")
    private String product;

    @NotEmpty(message = "Поле 'targetAudience' обязательно для заполнения")
    @ValidTargetAudience(message = "Поле 'targetAudience' должно содержать валидную структуру с полями genders, ageRanges, types")
    private Map<String, Object> targetAudience;

    @NotEmpty(message = "Поле 'region' обязательно для заполнения. Выберите хотя бы один регион")
    @ValidRegion(message = "Поле 'region' должно содержать один или несколько допустимых городов Казахстана")
    private List<String> region;

    @NotBlank(message = "Поле 'goal' обязательно для заполнения")
    @Size(min = 10, max = 500, message = "Поле 'goal' должно содержать от 10 до 500 символов")
    private String goal;

    @NotBlank(message = "Поле 'detailLevel' обязательно для заполнения")
    @ValidDetailLevel(message = "Поле 'detailLevel' должно быть одним из: КРАТКО, СТАНДАРТНО, ПОДРОБНО")
    private String detailLevel;

    @Size(max = 500, message = "Поле 'strongSide' должно содержать не более 500 символов")
    private String strongSide;

    @Size(max = 500, message = "Поле 'weakSide' должно содержать не более 500 символов")
    private String weakSide;
    
    @NotEmpty(message = "Поле 'analysisType' обязательно для заполнения. Выберите хотя бы один тип анализа")
    @ValidAnalysisType(message = "Поле 'analysisType' должно содержать один или несколько типов: РЫНОК, КОНКУРЕНТЫ, ЦА, КАНАЛЫ, SWOT")
    private List<String> analysisType;

    public DetailLevel getDetailLevelEnum() {
        return DetailLevel.fromString(detailLevel);
    }
    public List<AnalysisType> getAnalysisTypeEnums() {
        if (analysisType == null) {
            return List.of();
        }
        return analysisType.stream()
                .map(AnalysisType::fromString)
                .filter(type -> type != null)
                .toList();
    }
}
