package autotest.afe;

import autotest.common.StaticDataRepository;
import autotest.common.table.DynamicTable;
import autotest.common.table.RpcDataSource;
import autotest.common.table.DataSource.SortDirection;

import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONString;


/**
 * A table to display jobs, including a summary of host queue entries.
 */
public class JobTable extends DynamicTable {
    public static final String HOSTS_SUMMARY = "hosts_summary";
    public static final String CREATED_TEXT = "created_text";

    protected StaticDataRepository staticData = StaticDataRepository.getRepository();

    private static final String[][] JOB_COLUMNS = { {CLICKABLE_WIDGET_COLUMN, "Select"}, 
            { "id", "ID" }, { "owner", "Owner" }, { "name", "Name" },
            { "priority", "Priority" }, { "control_type", "Client/Server" },
            { CREATED_TEXT, "Created" }, { HOSTS_SUMMARY, "Status" } };

    public JobTable() {
        super(JOB_COLUMNS, new RpcDataSource("get_jobs_summary", "get_num_jobs"));
        sortOnColumn("id", SortDirection.DESCENDING);
    }

    @Override
    protected void preprocessRow(JSONObject row) {
        JSONObject counts = row.get("status_counts").isObject();
        String countString = AfeUtils.formatStatusCounts(counts, "\n");
        row.put(HOSTS_SUMMARY, new JSONString(countString));
        Double priorityValue = row.get("priority").isNumber().getValue();
        String priorityName = staticData.getPriorityName(priorityValue);
        row.put("priority", new JSONString(priorityName));
        
        // remove seconds from created time
        AfeUtils.removeSecondsFromDateField(row, "created_on", CREATED_TEXT);
    }
}
