package org.wikiwebserver.sync.gui;

import java.net.URL;
import java.util.Date;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.table.DefaultTableModel;

import org.wikiwebserver.sync.FileItem;

public class FileItemTableModel extends DefaultTableModel {
    
    private static final long serialVersionUID = 1L;
    
    private List<FileItem> list;
    
    public void setData(List<FileItem> list) {
        this.list = list;
        this.fireTableDataChanged();
    }

    public int getColumnCount() {
        return 5;
    }

    public int getRowCount() {
        if (list == null) return 0;
        return list.size();
    }
    
    public String getColumnName(int col) {
        switch (col) {
            case 0: 
                return "Change";             
            case 1:
                return "Site";   
            case 2:                
                return "Relative path";                                     
            case 3:
                return "Size";               
            case 4:
                return "Modified";  
            default:
                return "Unknown";                      
        }
    }
    

    public Object getValueAt(int row, int col) {
        FileItem item = list.get(row);
        switch (col) {
            case 0:
                return getChangeIcon(item.getType(), item.getState());                        
            case 1: 
                return item.getSite();    
            case 2:                
                return item.getRelPath();                                         
            case 3:
                return new Long(item.getLength());                 
            case 4:
                return new Date(item.getLastModified());                      
        }
        return null;
    }
    

    public Class<?> getColumnClass(int c) {
        if (list == null || list.size() == 0) return String.class;
        Object obj = getValueAt(0, c);
        if (obj == null) return String.class;
        return obj.getClass();
    }
    
    public boolean isCellEditable(int row, int col) {
        return false;
    }       
    
    private JLabel getChangeIcon(FileItem.Type type, FileItem.State state) {
        
        String name = "";
        String detail = "";
        
        switch (type) {
            case DIRECTORY:
                name = "folder_";  
                detail = "Folder "; 
                break;
            case FILE:
                name = "page_";  
                detail = "File ";    
        }
        switch (state) {
            case EXISTS:
                name += "add"; 
                detail += "sync required";  
                break;
            case MODIFIED:
                name += "edit";  
                detail += "modified";   
                break;
            case DELETED:
                name += "delete";       
                detail += "deleted";   
                break;     
            case NOT_MODIFIED:
                name = "arrow_refresh";  
                detail += "synchronized"; 
                break;  
            case UNKNOWN:
                name += "add"; 
                detail += "status unknown"; 
                break;                  
            default:            
                name = "arrow_error";
                detail += "error";  
        }        
        name += ".png";
        
        URL iconUrl = getClass().getResource("icons/" + name);
        if (iconUrl != null) {
            return new JLabel(detail, new ImageIcon(iconUrl), JLabel.LEFT);
        }
        
        return new JLabel("Failed to locate: " + "icons/" + name);
    }
     
}

