package go.kr.project.common.model;

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * packageName    : go.kr.project.common
 * fileName       : PagingVO
 * author         : 박성영
 * date           : 25. 5. 8.
 * description    : 페이징 처리를 위한 VO 클래스
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 25. 5. 8.        박성영       최초 생성
 */
@Data
@EqualsAndHashCode(callSuper=true)
public class PagingVO extends DefaultVO {

    /** 현재 페이지 번호 */

    private Integer page;

    /** 페이지당 항목 수 */
    private Integer perPage;

    /** 시작 인덱스 */
    private Integer startIndex;

    /** 끝 인덱스 */
    private Integer endIndex;

    /** 전체 페이지 수 */
    private Integer totalPages;

    /** 기본 페이지당 항목 수 */
    private static final int DEFAULT_PER_PAGE = 10;

    /**
     * 페이징 처리를 위한 시작 인덱스와 끝 인덱스를 계산합니다.
     */
    public void calculateIndex() {
        if (this.page == null) {
            this.page = 1;
        }

        if (this.perPage == null) {
            this.perPage = DEFAULT_PER_PAGE;
        }

        this.startIndex = (this.page - 1) * this.perPage;
        this.endIndex = this.startIndex + this.perPage;
    }

    /**
     * 전체 페이지 수를 계산합니다.
     */
    public void calculateTotalPages() {
        if (this.perPage == null) {
            this.perPage = DEFAULT_PER_PAGE;
        }

        if (this.getTotalCount() > 0) {
            this.totalPages = (int) Math.ceil((double) this.getTotalCount() / this.perPage);
        } else {
            this.totalPages = 0;
        }
    }

    /**
     * 페이징 여부를 설정합니다.
     * "Y" 값이 들어오면 자동으로 페이지 인덱스와 전체 페이지 수를 계산합니다.
     * 
     * @param pagingYn 페이징 여부 ("Y" 또는 "N")
     */
    @Override
    public void setPagingYn(String pagingYn) {
        super.setPagingYn(pagingYn);

        if ("Y".equals(pagingYn)) {
            // 페이지 인덱스 계산
            calculateIndex();
            // 전체 페이지 수 계산
            calculateTotalPages();
        }
    }

}
