/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.felix.ipojo.runtime.core;

import org.apache.felix.ipojo.ConfigurationException;
import org.apache.felix.ipojo.metadata.Element;
import org.apache.felix.ipojo.parser.*;
import org.apache.felix.ipojo.runtime.core.services.BarService;
import org.apache.felix.ipojo.runtime.core.services.FooService;
import org.junit.Before;
import org.junit.Test;
import org.ow2.chameleon.testing.helpers.BaseTest;

import java.util.Arrays;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.*;

public class TestManipulationMetadataAPI extends BaseTest {

    PojoMetadata FooProviderType1, FooBarProviderType1, FooProviderTypeDyn, PrimitiveManipulationTester, SimpleMultipleCheckServiceProvider;

    @Before
    public void setUp() {
        String comp_name = "ManipulationMetadata-FooProviderType-1";
        FooProviderType1 = getManipulationMetadataForComponent(comp_name);

        comp_name = "ManipulationMetadata-FooBarProviderType-1";
        FooBarProviderType1 = getManipulationMetadataForComponent(comp_name);

        comp_name = "ManipulationMetadata-FooProviderType-Dyn";
        FooProviderTypeDyn = getManipulationMetadataForComponent(comp_name);

        comp_name = "ManipulationMetadata-PrimitiveManipulationTester";
        PrimitiveManipulationTester = getManipulationMetadataForComponent(comp_name);

        comp_name = "ManipulationMetadata-SimpleMultipleCheckServiceProvider";
        SimpleMultipleCheckServiceProvider = getManipulationMetadataForComponent(comp_name);
    }

    @Test
    public void testGetMetadata() {
        String header = (String) getTestBundle().getHeaders().get("iPOJO-Components");
        Element elem = null;
        try {
            elem = ManifestMetadataParser.parseHeaderMetadata(header);
        } catch (ParseException e) {
            fail("Parse Exception when parsing iPOJO-Component");
        }

        assertNotNull("Check elem not null", elem);

        Element manip = getMetadataForComponent(elem, "ManipulationMetadata-FooProviderType-1");
        assertNotNull("Check manipulation metadata not null for " + "Manipulation-FooProviderType-1", manip);
        PojoMetadata mm;
        try {
            mm = new PojoMetadata(manip);
            assertNotNull("Check mm not null", mm);
        } catch (ConfigurationException e) {
            fail("The creation of pojo metadata has failed");
        }
    }

    @Test
    public void testInterface() {
        PojoMetadata manip = FooProviderType1;

        String[] itf = manip.getInterfaces();
        assertEquals("Check interfaces number", itf.length, 1);
        assertEquals("Check itf name", itf[0], FooService.class.getName());

        assertTrue("Check Foo Service implementation", manip.isInterfaceImplemented(FooService.class.getName()));
        assertFalse("Check Bar Service implementation", manip.isInterfaceImplemented(BarService.class.getName()));
    }

    @Test
    public void testInterfaces() {
        PojoMetadata manip = FooBarProviderType1;
        String[] itf = manip.getInterfaces();
        assertEquals("Check interfaces number", itf.length, 2);
        assertEquals("Check itf name", itf[0], FooService.class.getName());
        assertEquals("Check itf name", itf[1], BarService.class.getName());

        assertTrue("Check Foo Service implementation", manip.isInterfaceImplemented(FooService.class.getName()));
        assertTrue("Check Bar Service implementation", manip.isInterfaceImplemented(BarService.class.getName()));
    }

//    @Test
//    public void testInnerClasses() {
//        String comp_name = "org.apache.felix.ipojo.runtime.core.components.ComponentWithInnerClasses";
//        PojoMetadata metadata = getManipulationMetadataForComponent(comp_name);
//        assertEquals(metadata.getInnerClasses().length, 3);
//        assertNotNull(metadata.getMethodsFromInnerClass("MyInnerWithANativeMethod"));
//        assertNotNull(
//                getMethodMetadata(metadata.getMethodsFromInnerClass("MyInnerWithANativeMethod"),
//                        "foo"));
//
//        assertNotNull(
//                getMethodMetadata(metadata.getMethodsFromInnerClass("MyInnerClass"),
//                        "foo"));
//
//        assertNotNull(
//                getMethodMetadata(metadata.getMethodsFromInnerClass("1"),
//                        "run"));
//    }

    public static MethodMetadata getMethodMetadata(MethodMetadata[] methods, String name) {
        for (MethodMetadata m : methods) {
            if (m.getMethodName().equals(name)) {
                return m;
            }
        }
        return null;
    }

    @Test
    public void testFields() {
        PojoMetadata manip = FooProviderTypeDyn;

        FieldMetadata[] fields = manip.getFields();
        assertEquals("Check field count + " + fields.length, fields.length, 5);
        /*
        private int intProp;
		private String strProp;
		private String[] strAProp;
		private int[] intAProp;
		private boolean boolProp;
		 */

        FieldMetadata field;

        field = manip.getField("intProp");
        assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "intProp");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "int");
        assertEquals("Check field reflective type : " + field.getFieldName(), FieldMetadata.getReflectionType(field.getFieldType()), "int");

        field = manip.getField("intProp", "int");
        assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "intProp");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "int");

        field = manip.getField("intProp", "long");
        assertNull("Check bad field", field);

        field = manip.getField("strProp");
        assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "strProp");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "java.lang.String");
        assertEquals("Check field reflective type : " + field.getFieldName(), FieldMetadata.getReflectionType(field.getFieldType()), "java.lang.String");

        field = manip.getField("strProp", "String");
        assertNull("Check bad field", field);

        field = manip.getField("strProp", "java.lang.String");
        assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "strProp");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "java.lang.String");

        field = manip.getField("strAProp");
        assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "strAProp");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "java.lang.String[]");
        assertEquals("Check field reflective type : " + field.getFieldName() + " -> " + FieldMetadata.getReflectionType(field.getFieldType()), FieldMetadata.getReflectionType(field.getFieldType()), "[Ljava.lang.String;");

        field = manip.getField("strAProp", "java.lang.String[]");
        assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "strAProp");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "java.lang.String[]");

        field = manip.getField("strAProp", "String[]");
        assertNull("Check bad field", field);

        field = manip.getField("intAProp");
        assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "intAProp");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "int[]");
        assertEquals("Check field reflective type : " + field.getFieldName() + " -> " + FieldMetadata.getReflectionType(field.getFieldType()), FieldMetadata.getReflectionType(field.getFieldType()), "[I");

        field = manip.getField("intAProp", "int[]");
        assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "intAProp");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "int[]");

        field = manip.getField("intAProp", "String[]");
        assertNull("Check bad field", field);

        field = manip.getField("boolProp");
        assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "boolProp");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "boolean");
        assertEquals("Check field reflective type : " + field.getFieldName(), FieldMetadata.getReflectionType(field.getFieldType()), "boolean");

        field = manip.getField("boolProp", "boolean");
        assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "boolProp");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "boolean");

        field = manip.getField("boolProp", "bool");
        assertNull("Check bad field", field);
    }

    @Test
    public void testPrimitivesFields() {
        PojoMetadata manip = PrimitiveManipulationTester;
        FieldMetadata[] fields = manip.getFields();
        assertEquals("Check field count", fields.length, 16);

        FieldMetadata field;

        field = manip.getField("b");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "byte");
        field = manip.getField("s");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "short");
        field = manip.getField("i");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "int");
        field = manip.getField("l");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "long");
        field = manip.getField("d");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "double");
        field = manip.getField("f");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "float");
        field = manip.getField("c");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "char");
        field = manip.getField("bool");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "boolean");

        field = manip.getField("bs");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "byte[]");
        field = manip.getField("ss");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "short[]");
        field = manip.getField("is");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "int[]");
        field = manip.getField("ls");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "long[]");
        field = manip.getField("ds");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "double[]");
        field = manip.getField("fs");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "float[]");
        field = manip.getField("cs");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "char[]");
        field = manip.getField("bools");
        assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "boolean[]");
    }

    @Test
    public void testNoArgMethod() {
        PojoMetadata manip = SimpleMultipleCheckServiceProvider;
        MethodMetadata method = manip.getMethod("check");
        assertEquals("Check no args", method.getMethodArguments().length, 0);
        assertEquals("Check return", method.getMethodReturn(), "boolean");

        method = manip.getMethod("check", new String[0]);
        assertEquals("Check no args", method.getMethodArguments().length, 0);
        assertEquals("Check return", method.getMethodReturn(), "boolean");
    }

    @Test
    public void testOneArgsMethod() {
        PojoMetadata manip = SimpleMultipleCheckServiceProvider;
        MethodMetadata method = manip.getMethods("refBind")[0];
        assertEquals("Check args count", method.getMethodArguments().length, 1);
        assertEquals("Check args", method.getMethodArguments()[0], "org.osgi.framework.ServiceReference");
        assertEquals("Check return", method.getMethodReturn(), "void");

        method = manip.getMethod("refBind", new String[]{"org.osgi.framework.ServiceReference"});
        assertEquals("Check args count", method.getMethodArguments().length, 1);
        assertEquals("Check args", method.getMethodArguments()[0], "org.osgi.framework.ServiceReference");
        assertEquals("Check return", method.getMethodReturn(), "void");
    }

    @Test
    public void testTwoArgsMethod() {
        PojoMetadata manip = SimpleMultipleCheckServiceProvider;
        MethodMetadata method = manip.getMethods("doNothing")[0];
        assertEquals("Check args count", 2, method.getMethodArguments().length);
        assertEquals("Check args - 1", method.getMethodArguments()[0], "java.lang.Object");
        assertEquals("Check args - 2", method.getMethodArguments()[1], "java.lang.String");
        assertEquals("Check return", method.getMethodReturn(), "java.lang.Object");

        method = manip.getMethod("doNothing", new String[]{"java.lang.Object", "java.lang.String"});
        assertEquals("Check args count", 2, method.getMethodArguments().length);
        assertEquals("Check args - 1", method.getMethodArguments()[0], "java.lang.Object");
        assertEquals("Check args - 2", method.getMethodArguments()[1], "java.lang.String");
        assertEquals("Check return", method.getMethodReturn(), "java.lang.Object");
    }

    private Element getMetadataForComponent(Element metadata, String comp_name) {
        Element[] comps = metadata.getElements("component");
        for (int i = 0; i < comps.length; i++) {
            if (comps[i].containsAttribute("factory") && comps[i].getAttribute("factory").equals(comp_name)) {
                return comps[i];
            }
            if (comps[i].containsAttribute("name") && comps[i].getAttribute("name").equals(comp_name)) {
                return comps[i];
            }
        }
        return null;
    }

    private PojoMetadata getManipulationMetadataForComponent(String comp_name) {
        String header = (String) getTestBundle().getHeaders().get("iPOJO-Components");
        Element elem = null;
        try {
            elem = ManifestMetadataParser.parseHeaderMetadata(header);
        } catch (ParseException e) {
            fail("Parse Exception when parsing iPOJO-Component");
        }

        assertNotNull("Check elem not null", elem);

        Element manip = getMetadataForComponent(elem, comp_name);
        assertNotNull("Check manipulation metadata not null for " + comp_name, manip);
        try {
            return new PojoMetadata(manip);
        } catch (ConfigurationException e) {
            fail("The creation of pojo metadata for " + comp_name + " has failed");
            return null;
        }
    }

}
