/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  The ASF licenses this file to You
 * 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.  For additional information regarding
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */
package org.apache.roller.weblogger.ui.struts2.editor;

import java.util.ArrayList;
import java.util.List;

import java.util.ResourceBundle;
import org.apache.commons.lang3.StringUtils;
import org.apache.roller.util.RollerConstants;
import org.apache.roller.weblogger.pojos.MediaFileFilter;
import org.apache.roller.weblogger.pojos.MediaFileType;
import org.apache.roller.weblogger.pojos.MediaFileFilter.MediaFileOrder;
import org.apache.roller.weblogger.pojos.MediaFileFilter.SizeFilterType;

/**
 * Bean for holding media file search criteria.
 */
public class MediaFileSearchBean {
    private transient ResourceBundle bundle =
            ResourceBundle.getBundle("ApplicationResources");

    public static final int PAGE_SIZE = 10;

    // Media file name as search criteria
    private String name;

    // Media file type as search criteria
    private String type;

    // Type of size filter as search criteria
    private String sizeFilterType;

    // Size of file as search criteria
    private long size;

    // Size unit
    private String sizeUnit;

    // Tags as search criteria
    private String tags;

    // Page number of results
    private int pageNum = 0;
    
    // Sort option for search results
    private int sortOption;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public String getTypeLabel() {
        return this.bundle.getString(type);
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getSizeFilterType() {
        return sizeFilterType;
    }

    public void setSizeFilterType(String sizeFilterType) {
        this.sizeFilterType = sizeFilterType;
    }

    public String getSizeFilterTypeLabel() {
        return this.bundle.getString(sizeFilterType);
    }

    public long getSize() {
        return size;
    }

    public void setSize(long size) {
        this.size = size;
    }

    public String getSizeUnit() {
        return sizeUnit;
    }

    public String getSizeUnitLabel() {
        return this.bundle.getString(sizeUnit);
    }

    public void setSizeUnit(String sizeUnit) {
        this.sizeUnit = sizeUnit;
    }

    public String getTags() {
        return tags;
    }

    public void setTags(String tags) {
        this.tags = tags;
    }

    public int getPageNum() {
        return pageNum;
    }

    public void setPageNum(int pageNum) {
        this.pageNum = pageNum;
    }

    public int getSortOption() {
        return sortOption;
    }

    public void setSortOption(int sortOption) {
        this.sortOption = sortOption;
    }

    /**
     * Copies data from this bean to media file filter object.
     *
     */
    public void copyTo(MediaFileFilter dataHolder) {
        dataHolder.setName(this.name);

        if (!StringUtils.isEmpty(this.type)) {
            MediaFileType filterType = null;
            if ("mediaFileView.audio".equals(this.type)) {
                filterType = MediaFileType.AUDIO;
            } else if ("mediaFileView.video".equals(this.type)) {
                filterType = MediaFileType.VIDEO;
            } else if ("mediaFileView.image".equals(this.type)) {
                filterType = MediaFileType.IMAGE;
            } else if ("mediaFileView.others".equals(this.type)) {
                filterType = MediaFileType.OTHERS;
            } 

            dataHolder.setType(filterType);
        }

        if (this.size > 0) {
            SizeFilterType sftype = SizeFilterType.EQ;
            if ("mediaFileView.gt".equals(this.sizeFilterType)) {
                sftype = SizeFilterType.GT;
            } else if ("mediaFileView.ge".equals(this.sizeFilterType)) {
                sftype = SizeFilterType.GTE;
            } else if ("mediaFileView.eq".equals(this.sizeFilterType)) {
                sftype = SizeFilterType.EQ;
            } else if ("mediaFileView.le".equals(this.sizeFilterType)) {
                sftype = SizeFilterType.LTE;
            } else if ("mediaFileView.lt".equals(this.sizeFilterType)) {
                sftype = SizeFilterType.LT;
            }
            dataHolder.setSizeFilterType(sftype);

            long filterSize = this.size ;
            if ("mediaFileView.kb".equals(this.sizeUnit)) {
                filterSize = this.size * RollerConstants.ONE_KB_IN_BYTES;
            } else if ("mediaFileView.mb".equals(this.sizeUnit)) {
                    filterSize = this.size * RollerConstants.ONE_MB_IN_BYTES;
            }
            dataHolder.setSize(filterSize);
        }

        if (!StringUtils.isEmpty(this.tags)) {
            List<String> tagsSet = new ArrayList<String>();
            for (String tag : this.tags.split(" ")) {
                tagsSet.add(tag);
            }
            dataHolder.setTags(tagsSet);
        }

        dataHolder.setStartIndex(pageNum * PAGE_SIZE);

        // set length to fetch to one more than what is required.
        // this would help us determine whether there are more pages
        dataHolder.setLength(PAGE_SIZE + 1);

        MediaFileOrder order;
        switch (this.sortOption) {
            case 0:
                order = MediaFileOrder.NAME;
                break;
            case 1:
                order = MediaFileOrder.DATE_UPLOADED;
                break;
            case 2:
                order = MediaFileOrder.TYPE;
                break;
            default:
                order = null;
        }
        dataHolder.setOrder(order);
    }
}
