/*******************************************************************************
 * Copyright (c) 2005, 2008 IBM Corporation and Others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Kentarou FUKUDA - initial API and implementation
 *******************************************************************************/

package org.eclipse.actf.visualization.eval.guideline;

import java.text.MessageFormat;

import org.eclipse.actf.visualization.Constants;
import org.eclipse.actf.visualization.eval.EvaluationPlugin;
import org.eclipse.actf.visualization.eval.IEvaluationItem;
import org.eclipse.actf.visualization.eval.IGuidelineItem;
import org.eclipse.swt.graphics.Image;



public class EvaluationItem implements IEvaluationItem{

    private String id = "";

    private GuidelineItem[] guidelines = new GuidelineItem[0];

    private MetricsItem[] metrics = new MetricsItem[0];

    private String description;

    private String[] tableDataMetrics = new String[0];

    private String[] tableDataGuideline = new String[0];

    private Image[] metricsIcons = new Image[0];

    private int[] metricsScores = new int[0];

    private short severity = SEV_INFO;
    
    private String severityStr = SEV_INFO_STR;

    /**
     * @param id
     */
    public EvaluationItem(String id, String severity) {
        this.id = id;
        setSeverity(severity);        
        description = GuidelineItemDescription.getDescription(id);
    }

    public String createDescription(String targetString) {
        return MessageFormat.format(description, new Object[] {targetString});
    }

    public String createDescription() {
            return (description);
    }

    public GuidelineItem[] getGuidelines() {
        return guidelines;
    }

    protected void setGuidelines(GuidelineItem[] guidelines) {
        this.guidelines = guidelines;
    }

    public String getId() {
        return id;
    }

    public int getSeverity() {
        return severity;
    }
    
    public String getSeverityStr(){
        return severityStr;
    }

    private void setSeverity(String _severityStr) {
        severity = SEV_INFO;
        severityStr = SEV_INFO_STR;
        if (_severityStr != null) {
            _severityStr = _severityStr.trim();
            if (SEV_ERROR_STR.equalsIgnoreCase(_severityStr)) {
                severity = SEV_ERROR;
                severityStr = SEV_ERROR_STR;
            } else if (SEV_WARNING_STR.equalsIgnoreCase(_severityStr)) {
                severity = SEV_WARNING;
                severityStr = SEV_WARNING_STR;
            }
            //else{
            //severity = SEV_INFO;
            //}
        }
    }

    public MetricsItem[] getMetricsItems() {
        return metrics;
    }

    protected void setMetrics(MetricsItem[] metrics) {
        this.metrics = metrics;
    }

    protected void initTableData(String[] guidelineNames, String[] metricsNames) {
        tableDataGuideline = new String[guidelineNames.length];
        tableDataMetrics = new String[metricsNames.length];
        metricsScores = new int[metricsNames.length];
        metricsIcons = new Image[metricsNames.length];
        for (int i = 0; i < guidelineNames.length; i++) {
            StringBuffer tmpSB = new StringBuffer();
            boolean notFirst = false;
            for (int j = 0; j < guidelines.length; j++) {
                IGuidelineItem tmpItem = guidelines[j];
                if (guidelineNames[i].equalsIgnoreCase(tmpItem.getGuidelineName())) {
                    if (notFirst) {
                        tmpSB.append(", ");
                    } else {
                        notFirst = true;
                    }
                    if (tmpItem.getLevel().length() > 0) {
                        tmpSB.append(tmpItem.getLevel() + ": " + tmpItem.getId());
                    } else {
                        tmpSB.append(tmpItem.getId());
                    }
                }
            }
            tableDataGuideline[i] = tmpSB.toString();
        }

        for (int i = 0; i < metricsNames.length; i++) {
            String curName = metricsNames[i];
            tableDataMetrics[i] = "";
            metricsScores[i] = 0;
            metricsIcons[i] = null;
            for (int j = 0; j < metrics.length; j++) {
                MetricsItem tmpItem = metrics[j];
                if (curName.equalsIgnoreCase(tmpItem.getMetricsName())) {
                    metricsScores[i] = tmpItem.getScore();
                    if (tmpItem.getScore() != 0) {
                        tableDataMetrics[i] = Integer.toString(-tmpItem.getScore());
                    }

                    //TODO reuse
                    switch (this.severity) {
                    case SEV_ERROR:
                        if (curName.equalsIgnoreCase("compliance")) {
                            metricsIcons[i] = EvaluationPlugin.getImageDescriptor("icons/ErrC.png").createImage();
                        } else if (curName.equalsIgnoreCase("navigability")) {
                            metricsIcons[i] = EvaluationPlugin.getImageDescriptor("icons/ErrN.png").createImage();
                        } else if (curName.equalsIgnoreCase("listenability")) {
                            metricsIcons[i] = EvaluationPlugin.getImageDescriptor("icons/ErrL.png").createImage();
                        } else {
                            metricsIcons[i] = EvaluationPlugin.getImageDescriptor("icons/Err.png").createImage();
                        }
                        break;
                    case SEV_WARNING:
                        if (curName.equalsIgnoreCase("compliance")) {
                            metricsIcons[i] = EvaluationPlugin.getImageDescriptor("icons/WarnC.png").createImage();
                        } else if (curName.equalsIgnoreCase("navigability")) {
                            metricsIcons[i] = EvaluationPlugin.getImageDescriptor("icons/WarnN.png").createImage();
                        } else if (curName.equalsIgnoreCase("listenability")) {
                            metricsIcons[i] = EvaluationPlugin.getImageDescriptor("icons/WarnL.png").createImage();
                        } else {
                            metricsIcons[i] = EvaluationPlugin.getImageDescriptor("icons/Warn.png").createImage();
                        }
                        break;
                    case SEV_INFO:
                        if (curName.equalsIgnoreCase("compliance")) {
                            metricsIcons[i] = EvaluationPlugin.getImageDescriptor("icons/InfoC.png").createImage();
                        } else if (curName.equalsIgnoreCase("navigability")) {
                            metricsIcons[i] = EvaluationPlugin.getImageDescriptor("icons/InfoN.png").createImage();
                        } else if (curName.equalsIgnoreCase("listenability")) {
                            metricsIcons[i] = EvaluationPlugin.getImageDescriptor("icons/InfoL.png").createImage();
                        } else {
                            metricsIcons[i] = EvaluationPlugin.getImageDescriptor("icons/Info.png").createImage();
                        }
                        break;
                    }

                }
            }
        }

    }

    public String toString() {
        StringBuffer tmpSB = new StringBuffer();
        tmpSB.append(id + " " + severity + " : " + Constants.LINE_SEP);
        for (int i = 0; i < guidelines.length; i++) {
            tmpSB.append("  " + guidelines[i] + Constants.LINE_SEP);
        }

        for (int i = 0; i < tableDataGuideline.length; i++) {
            tmpSB.append("  " + tableDataGuideline[i] + Constants.LINE_SEP);
        }

        for (int i = 0; i < metrics.length; i++) {
            tmpSB.append("  " + metrics[i] + Constants.LINE_SEP);
        }

        for (int i = 0; i < tableDataMetrics.length; i++) {
            tmpSB.append("  " + tableDataMetrics[i] + Constants.LINE_SEP);
        }

        return (tmpSB.toString());
    }

    public int[] getMetricsScores() {
        return metricsScores;
    }

    public String[] getTableDataGuideline() {
        return tableDataGuideline;
    }

    public String[] getTableDataMetrics() {
        return tableDataMetrics;
    }

    public Image[] getMetricsIcons() {
        return metricsIcons;
    }
}
