/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.addthis.hydra.task.map;

import com.addthis.codec.annotations.FieldConfig;

/**
 * @user-reference
 */
public class DataPurgeConfig {

    /**
     * Base directory to search for data to purge. This field is required.
     */
    @FieldConfig(codable = true, required = true)

    private String[] directoryPrefix;

    /**
     * The <a href="http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html">DateTimeFormat</a>
     * for the date substring. This field is required.
     */
    @FieldConfig(codable = true, required = true)
    private String datePathFormat;

    /**
     * Maximum age in days of data to retain. Anything
     * older than this value will be purged. This field is required.
     */
    @FieldConfig(codable = true, required = true)
    private int maxAgeInDays;

    /**
     * If maxAgeInDays is zero then this parameter is the
     * maximum age in hours of data to retain. Anything
     * older than this value will be purged.
     */
    @FieldConfig(codable = true)
    private int maxAgeInHours = -1;

    /**
     * If true then purge should be done by file rather than by directory. Default is false.
     */
    @FieldConfig(codable = true)
    private boolean fileBasedPurge = false;

    /**
     * If fileBasedPurge is true then use this as the start index
     * to look for the date string in the file. If performing
     * a file-based purge then this field is required.
     */
    @FieldConfig(codable = true)
    private int dateStartIndex = -1;

    /**
     * If fileBasedPurge is true then use this as the length
     * of the substring to look for the date string in the file.
     * If performing a file-based purge then this field is required.
     */
    @FieldConfig(codable = true)
    private int dateStringLength = -1;

    /**
     * If true then delete empty directories. Default is false.
     */
    @FieldConfig(codable = true)
    private boolean cleanEmptyParents = false;

    public DataPurgeConfig() {
    }

    public void setDirectoryPrefix(String[] directoryPrefix) {
        this.directoryPrefix = directoryPrefix;
    }

    public void setDatePathFormat(String datePathFormat) {
        this.datePathFormat = datePathFormat;
    }

    public void setMaxAgeInDays(int maxAgeInDays) {
        this.maxAgeInDays = maxAgeInDays;
    }

    public void setMaxAgeInHours(int maxAgeInHours) {
        this.maxAgeInHours = maxAgeInHours;
    }

    public void setFileBasedPurge(boolean fileBasedPurge) {
        this.fileBasedPurge = fileBasedPurge;
    }

    public void setDateStartIndex(int dateStartIndex) {
        this.dateStartIndex = dateStartIndex;
    }

    public void setDateStringLength(int dateStringLength) {
        this.dateStringLength = dateStringLength;
    }

    public void setCleanEmptyParents(boolean cleanEmptyParents) {
        this.cleanEmptyParents = cleanEmptyParents;
    }

    public String[] getDirectoryPrefix() {
        return directoryPrefix;
    }

    public String getDatePathFormat() {
        return datePathFormat;
    }

    public int getMaxAgeInDays() {
        return maxAgeInDays;
    }

    public int getMaxAgeInHours() {
        return maxAgeInHours;
    }

    public boolean isFileBasedPurge() {
        return fileBasedPurge;
    }

    public int getDateStartIndex() {
        return dateStartIndex;
    }

    public int getDateStringLength() {
        return dateStringLength;
    }

    public boolean getCleanEmptyParents() {
        return cleanEmptyParents;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        DataPurgeConfig that = (DataPurgeConfig) o;

        if (dateStartIndex != that.dateStartIndex) {
            return false;
        }
        if (fileBasedPurge != that.fileBasedPurge) {
            return false;
        }
        if (maxAgeInDays != that.maxAgeInDays) {
            return false;
        }
        if (datePathFormat != null ? !datePathFormat.equals(that.datePathFormat) : that.datePathFormat != null) {
            return false;
        }
        if (directoryPrefix != null ? !directoryPrefix.equals(that.directoryPrefix) : that.directoryPrefix != null) {
            return false;
        }

        return true;
    }

    @Override
    public int hashCode() {
        int result = directoryPrefix != null ? directoryPrefix.hashCode() : 0;
        result = 31 * result + (datePathFormat != null ? datePathFormat.hashCode() : 0);
        result = 31 * result + maxAgeInDays;
        result = 31 * result + (fileBasedPurge ? 1 : 0);
        result = 31 * result + dateStartIndex;
        return result;
    }
}

@@ -837,18 +837,40 @@
 d = true
+, autocollection = true
 )
-%0A
 %0A    pri

enable autocollection on some codable field