package com.ga.common.model;

import com.github.pagehelper.PageHelper;
import lombok.Data;

/**
 * 공통 검색 파라미터. 모든 *SearchParam 의 부모.
 *
 * 사용:
 *   public PageResponse<X> list(XSearchParam p) {
 *       p.startPage();
 *       return PageResponse.of(mapper.selectList(p));
 *   }
 */
@Data
public class SearchParam {

    private int pageNum = 1;
    private int pageSize = 20;

    private String searchType;
    private String searchKeyword;

    private String startDate;
    private String endDate;

    private String status;

    private String sortField;
    private String sortOrder = "DESC";

    /** MyBatis XML에서 #{offset} 참조 시 사용되는 계산값 */
    public int getOffset() {
        return Math.max(0, pageNum - 1) * pageSize;
    }

    /** PageHelper 시작 호출. Service 첫 줄에서 호출한다. */
    public void startPage() {
        PageHelper.startPage(pageNum, pageSize);
        if (sortField != null && !sortField.isBlank()) {
            String order = "ASC".equalsIgnoreCase(sortOrder) ? "ASC" : "DESC";
            PageHelper.orderBy(sanitizeSortField(sortField) + " " + order);
        }
    }

    /** SQL Injection 방지: 영문/숫자/_ 만 허용 */
    private String sanitizeSortField(String s) {
        return s.replaceAll("[^A-Za-z0-9_]", "");
    }
}
