package incheon.ags.mrb.style.vo;

import incheon.com.cmm.ComDefaultVO;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.Size;

/**
 * 스타일 검색 VO
 * MapPrime v2.0 Style API 검색용
 */
@lombok.Getter @lombok.Setter
@EqualsAndHashCode(callSuper = false)
public class StyleSearchVO extends ComDefaultVO {
    
    /** 검색 키워드 (LayerStyleMapper.xml 호환) */
    @Size(max = 100, message = "검색 키워드는 100자를 초과할 수 없습니다")
    private String searchKeyword;
    
    /** 검색 키워드 (MapPrime API 호환) */
    @Size(max = 100, message = "검색 키워드는 100자를 초과할 수 없습니다")
    private String keyword;
    
    /** 접두사로 시작하는 단어 */
    @Size(max = 50, message = "접두사는 50자를 초과할 수 없습니다")
    private String prefix;
    
    /** 워크스페이스 필터 */
    @Size(max = 50, message = "워크스페이스 이름은 50자를 초과할 수 없습니다")
    private String workspace;
    
    /** 스타일 타입 필터 */
    private String styleType;

    /** 공간 타입 필터 */
    @Size(max = 50, message = "공간 타입은 50자를 초과할 수 없습니다")
    private String spceTy;

    /** 사용 여부 필터 */
    private String useYn;
    
    /** 기본 스타일 여부 필터 */
    private String defaultYn;
    
    /** 생성일 시작 범위 */
    private String createdDateFrom;
    
    /** 생성일 종료 범위 */
    private String createdDateTo;
    
    /** 생성자 필터 */
    private String createdBy;
    
    /** 레이어명 필터 */
    private String layerName;
    
    /** 정렬 기준 (name, created_at, updated_at) */
    private String sortBy;
    
    /** 정렬 방향 (ASC, DESC) */
    private String sortDirection;
    
    /** 검색 대상 필드 (name, title, description) */
    private String searchField;
    
    /**
     * 검색 조건이 있는지 확인
     * @return 검색 조건이 하나라도 있으면 true
     */
    public boolean hasSearchCondition() {
        return (keyword != null && !keyword.trim().isEmpty()) ||
               (prefix != null && !prefix.trim().isEmpty()) ||
               (workspace != null && !workspace.trim().isEmpty()) ||
               (styleType != null && !styleType.trim().isEmpty()) ||
               (spceTy != null && !spceTy.trim().isEmpty()) ||
               (useYn != null && !useYn.trim().isEmpty()) ||
               (defaultYn != null && !defaultYn.trim().isEmpty()) ||
               (createdDateFrom != null && !createdDateFrom.trim().isEmpty()) ||
               (createdDateTo != null && !createdDateTo.trim().isEmpty()) ||
               (createdBy != null && !createdBy.trim().isEmpty()) ||
               (layerName != null && !layerName.trim().isEmpty());
    }
    
    /**
     * 정렬 기준 기본값 설정
     */
    public void setDefaultSortIfEmpty() {
        if (sortBy == null || sortBy.trim().isEmpty()) {
            this.sortBy = "created_at";
        }
        if (sortDirection == null || sortDirection.trim().isEmpty()) {
            this.sortDirection = "DESC";
        }
    }
    
    /**
     * 검색 필드 기본값 설정
     */
    public void setDefaultSearchFieldIfEmpty() {
        if (searchField == null || searchField.trim().isEmpty()) {
            this.searchField = "name";
        }
    }
    
    /**
     * 키워드 검색을 위한 LIKE 패턴 생성
     * @return LIKE 검색용 패턴 (양쪽에 % 추가)
     */
    public String getKeywordLikePattern() {
        if (keyword == null || keyword.trim().isEmpty()) {
            return null;
        }
        return "%" + keyword.trim() + "%";
    }
    
    /**
     * 접두사 검색을 위한 LIKE 패턴 생성
     * @return LIKE 검색용 패턴 (뒤쪽에만 % 추가)
     */
    public String getPrefixLikePattern() {
        if (prefix == null || prefix.trim().isEmpty()) {
            return null;
        }
        return prefix.trim() + "%";
    }
}