package com.itmill.toolkit.demo.jspexample;

import java.io.ByteArrayInputStream;
import java.net.URL;
import java.util.Random;

import com.itmill.toolkit.Application;
import com.itmill.toolkit.data.Item;
import com.itmill.toolkit.terminal.DownloadStream;
import com.itmill.toolkit.terminal.URIHandler;
import com.itmill.toolkit.ui.Table;
import com.itmill.toolkit.ui.Window;

public class TableApplication extends Application implements URIHandler {
       
    private Table table;
    
    private final int PERSON_COUNT = 1000;    
    private final Person[] persons = new Person[PERSON_COUNT];
    
    private String[] firstNames = {
            "John", "Jack", "Bill", "Steven", "Timothy", "Clint",  
            "Rachel", "Tea", "Mary", "Lisa", "Jane", "Jill", "Tina",
            "Ben", "Michael", "Michelle"
    };
    private String[] lastNames = {
            "Doe", "Bauer", "Torvalds", "Gates", "Jobs"
    };
           
    
    // from abstract Application class 
    @Override
    public void init() {
        initPersons();
        
        Window window = new Window();
        setMainWindow(window);
     
        // create and populate the table
        table = new Table();
        table.setWidth(500);
        table.addContainerProperty("First name", String.class, "");
        table.addContainerProperty("Last name", String.class, "");
        refreshTable(null);
               
        window.addComponent(table);
    }
    
    
    private void initPersons() {
        // generate random persons
        Random random = new Random();
        for (int i = 0; i < PERSON_COUNT; i++) {          
            persons[i] = new Person(firstNames[random.nextInt(firstNames.length)],
                                    lastNames[random.nextInt(lastNames.length)]);
        }
    }
    
    
    private void refreshTable(String filterString) {
        // empty the table
        table.removeAllItems();
        
        // we want to ignore case
        if (filterString != null) {
            filterString = filterString.toLowerCase();
        }
        
        for (int i = 0; i < persons.length; i++) {
            Person person = persons[i];
            
            // check for a matching first name
            boolean matches = true;
            if (filterString != null && filterString.length() > 0) {
                matches = (person.getFirstName().toLowerCase().startsWith(filterString));                
            }
            
            // add to table if a match was found
            if (matches) {
                Item row = (Item) table.addItem(Integer.valueOf(i));
                row.getItemProperty("First name").setValue(person.getFirstName());
                row.getItemProperty("Last name").setValue(person.getLastName());
            }
        }
    }
    
    
    // from URIHandler interface
    @Override
    public DownloadStream handleURI(URL context, String relativeUri) {
        if (relativeUri.startsWith("refresh/")) {
            refreshTable(relativeUri.substring("refresh/".length()));
            return new DownloadStream(new ByteArrayInputStream(Integer.toString(table.size())
                    .getBytes()), "text/plain", null);
        }        
                
        return super.handleURI(context, relativeUri);
    }

    
    
    /**
     * A simple Person class with first and last name.
     * 
     * @author Teemu Pöntelin / IT Mill Ltd     
     */
    private static class Person {
        private final String firstName;
        private final String lastName;
        
        public Person(String fname, String lname) {
            firstName = fname;
            lastName = lname;
        }       
        public String getFirstName() {
            return firstName;
        }
        public String getLastName() {
            return lastName;
        }
    }     
}

