package incheon.ags.mrb.style.web.dto;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;

import javax.validation.constraints.Min;
import javax.validation.constraints.Size;

/**
 * 레시피 레이어 스타일 검색 DTO
 * - 검색 조건만 포함
 */
@lombok.Getter @lombok.Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class RecipeStyleSearchDTO {

    /** 검색 키워드 (스타일명 또는 서비스명 검색) */
    @Size(max = 100, message = "검색 키워드는 100자를 초과할 수 없습니다")
    private String searchKeyword;

    /** 스타일 타입 코드 (S: 단일, G: 범위별, C: 유형별, R: 규칙) */
    private String styleType;

    /** 공간 타입 (POINT, LINE, POLYGON) */
    @Size(max = 50, message = "공간 타입은 50자를 초과할 수 없습니다")
    private String spceTy;

    /** 생성일 시작 범위 (yyyy-MM-dd) */
    private String createdDateFrom;

    /** 생성일 종료 범위 (yyyy-MM-dd) */
    private String createdDateTo;

    /** 정렬 기준 (styleName, createdAt, updatedAt) */
    @Builder.Default
    private String sortBy = "updatedAt";

    /** 정렬 방향 (ASC, DESC) */
    @Builder.Default
    private String sortDirection = "DESC";

    /** 페이지 번호 (1부터 시작) */
    @Min(value = 1, message = "페이지 번호는 1 이상이어야 합니다")
    @Builder.Default
    private Integer pageNumber = 1;

    /** 페이지 크기 (고정값: 10) */
    @Min(value = 1, message = "페이지 크기는 1 이상이어야 합니다")
    @Builder.Default
    private Integer pageSize = 10;

    /** 첫 번째 인덱스 (offset 계산용) */
    private Integer firstIndex;

    /**
     * 검색 조건이 있는지 확인
     * @return 검색 조건이 하나라도 있으면 true
     */
    public boolean hasSearchCondition() {
        return (searchKeyword != null && !searchKeyword.trim().isEmpty()) ||
               (styleType != null && !styleType.trim().isEmpty()) ||
               (spceTy != null && !spceTy.trim().isEmpty()) ||
               (createdDateFrom != null && !createdDateFrom.trim().isEmpty()) ||
               (createdDateTo != null && !createdDateTo.trim().isEmpty());
    }

    /**
     * offset 계산
     * @return offset 값
     */
    public int calculateOffset() {
        int page = (pageNumber != null && pageNumber > 0) ? pageNumber : 1;
        int size = (pageSize != null && pageSize > 0) ? pageSize : 10;
        return (page - 1) * size;
    }

    /**
     * 페이징 정보 초기화
     */
    public void initializePaging() {
        if (pageNumber == null || pageNumber < 1) {
            pageNumber = 1;
        }
        if (pageSize == null || pageSize < 1) {
            pageSize = 10;
        }
        firstIndex = calculateOffset();
    }
}
