package com.github.mygreen.supercsv.cellprocessor.conversion;

import org.supercsv.cellprocessor.CellProcessorAdaptor;
import org.supercsv.cellprocessor.ift.StringCellProcessor;
import org.supercsv.util.CsvContext;

/**
 * 文字列を切り詰めるCellProcessor
 *
 * @since 2.0
 * @author T.TSUCHIE
 *
 */
public class Truncate extends CellProcessorAdaptor implements StringCellProcessor{
    
    private final int maxSize;
    private final String suffix;
    
    public Truncate(final int maxSize, final String suffix) {
        super();
        checkPreconditions(maxSize, suffix);
        this.maxSize = maxSize;
        this.suffix = suffix;
    }
    
    public Truncate(final int maxSize, final String suffix, final StringCellProcessor next) {
        super(next);
        checkPreconditions(maxSize, suffix);
        this.maxSize = maxSize;
        this.suffix = suffix;
    }
    
    private static void checkPreconditions(final int maxSize, final String suffix) {
        if( maxSize <= 0 ) {
            throw new IllegalArgumentException(String.format("maxSize should be > 0 but was %d", maxSize));
        }
        
        if( suffix == null ) {
            throw new NullPointerException("suffix should not be null");
        }
    }
    
    @Override
    public <T> T execute(final Object value, final CsvContext context) {
        if(value == null) {
            return next.execute(value, context);
        }
        
        final String stringValue = value.toString();
        final String result;
        if(stringValue.length() <= maxSize) {
            result = stringValue;
        } else {
            result = stringValue.substring(0, maxSize) + suffix;
        }
        
        return next.execute(result, context);
        
    }
    
    /**
     * 最大文字長を取得する。
     * @return 最大文字長
     */
    public int getMaxSize() {
        return maxSize;
    }
    
    /**
     * 接尾語を取得する
     * @return 接尾語
     */
    public String getSuffix() {
        return suffix;
    }
    
}