package sgc.portal.base.storage;

import org.apache.commons.lang3.ArrayUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;

/**
 * 날짜를 기반으로 하여 첨부파일 디렉토리 체계를 생성한다.
 * 첨부파일이 많을 경우 한 디렉토리에 너무 많은 파일을 보관하면
 * 관리상 어려움이 있으므로 첨부 파일이 주, 월, 분기, 년 단위로 얼마나 첨부가 될지
 * 확인 후 적절한 전략을 사용하여 첨부파일을 관리한다.
 *
 * @author YongSang
 * @version 1.0.0
 * @since 2020. 9. 5.
 */
public class DateBasedSubpath implements Subpath {
    private final boolean y;
    private final boolean m;
    private final boolean d;
    private final List<String> initPath;

    /**
     * Instantiates a new Date based subpath.
     *
     * @param others the others
     */
    public DateBasedSubpath(String... others) {
        this(true, true, false, others);
    }

    /**
     * Instantiates a new Date based subpath.
     *
     * @param y the y
     */
    public DateBasedSubpath(boolean y) {
        this(y, false, false, ArrayUtils.EMPTY_STRING_ARRAY);
    }

    /**
     * Instantiates a new Date based subpath.
     *
     * @param y the y
     * @param m the m
     */
    public DateBasedSubpath(boolean y, boolean m) {
        this(y, m, false, ArrayUtils.EMPTY_STRING_ARRAY);
    }

    /**
     * Instantiates a new Date based subpath.
     *
     * @param y the y
     * @param m the m
     * @param d the d
     */
    public DateBasedSubpath(boolean y, boolean m, boolean d) {
        this(y, m, d, ArrayUtils.EMPTY_STRING_ARRAY);
    }

    /**
     * Instantiates a new Date based subpath.
     *
     * @param y      the y
     * @param m      the m
     * @param d      the d
     * @param others the others
     */
    private DateBasedSubpath(boolean y, boolean m, boolean d, String... others) {
        this.y = y;
        this.m = m;
        this.d = d;
        initPath = (others != null) ? new ArrayList<>(Arrays.asList(others)) : new ArrayList<>();
    }

    @Override
    public List<String> resolve() {
        List<String> subpath = new ArrayList<>(initPath);
        Calendar now = Calendar.getInstance();
        if (y) {
            subpath.add(String.valueOf(now.get(Calendar.YEAR)));
        }
        if (m) {
            subpath.add(String.valueOf(now.get(Calendar.MONTH) + 1));
        }
        if (d) {
            subpath.add(String.valueOf(now.get(Calendar.DAY_OF_MONTH)));
        }
        return subpath;
    }
}