/*******************************************************************************
 * Copyright (c) 2010-2014 SAP AG 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:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.skalli.testutil;

import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;

import org.eclipse.skalli.model.ExtensionEntityBase;
import org.eclipse.skalli.model.Property;
import org.eclipse.skalli.model.PropertyName;

@SuppressWarnings("nls")
public class TestExtension extends ExtensionEntityBase {

    public static class Inner {
        private String str = "";

        public Inner(String str) {
            this.str = str;
        }

        @Property
        public String getStr() {
            return str;
        }
    }

    @PropertyName
    public static final String PROPERTY_BOOL = "bool";

    @PropertyName
    public static final String PROPERTY_STR = "str";

    @PropertyName
    public static final String PROPERTY_ITEMS = "items";

    private boolean bool;
    private String str = "";
    private ArrayList<String> items = new ArrayList<String>();
    private String unpublished;
    private TreeMap<String,Inner> map = new TreeMap<String,Inner>();

    public TestExtension() {
    }

    public boolean isBool() {
        return bool;
    }

    public void setBool(boolean bool) {
        this.bool = bool;
    }

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    public List<String> getItems() {
        return items;
    }

    public void setItems(List<String> list) {
        items = new ArrayList<String>(list);
    }

    public void addItem(String item) {
        items.add(item);
    }

    public void removeItem(String item) {
        items.remove(item);
    }

    public boolean hasItem(String item) {
        return getItems().contains(item);
    }

    // getter with no corresponding @PropertyName constant
    public String getUnpublished() {
        return unpublished;
    }

    public void setUnpublished(String unpublished) {
        this.unpublished = unpublished;
    }

    @Property
    public Inner getInner(String key) {
        return map.get(key);
    }

    public void putInner(String key, Inner value) {
        map.put(key, value);
    }

    public static boolean assertEquals(TestExtension o1, TestExtension o2) {
        boolean equals = true;
        equals &= o1.isBool() == o2.isBool();
        equals &= o1.getStr().equals(o2.getStr());
        for (int i = 0; i < o1.getItems().size(); ++i) {
            equals &= o1.getItems().get(i).equals(o2.getItems().get(i));
        }
        return equals;
    }
}
