/*
 * Copyright 2010-2011 Ning, Inc.
 *
 * Ning 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 com.ning.billing.payment.glue;

import java.io.IOException;
import java.net.URL;
import java.util.Map;
import java.util.Properties;

import org.skife.config.ConfigSource;
import org.skife.config.SimplePropertyConfigSource;

import com.ning.billing.config.PaymentConfig;
import com.ning.billing.mock.glue.MockInvoiceModule;
import com.ning.billing.mock.glue.MockNotificationQueueModule;
import com.ning.billing.mock.glue.TestDbiModule;
import com.ning.billing.payment.dao.MockPaymentDao;
import com.ning.billing.payment.dao.PaymentDao;
import com.ning.billing.payment.provider.MockPaymentProviderPluginModule;
import com.ning.billing.util.globallocker.GlobalLocker;
import com.ning.billing.util.globallocker.MockGlobalLocker;
import com.ning.billing.util.glue.BusModule;
import com.ning.billing.util.glue.BusModule.BusType;
import com.ning.billing.util.glue.TagStoreModule;

import static org.testng.Assert.assertNotNull;

public class PaymentTestModuleWithMocks extends PaymentModule {
    public static final String PLUGIN_TEST_NAME = "my-mock";

    private void loadSystemPropertiesFromClasspath(final String resource) {
        final URL url = PaymentTestModuleWithMocks.class.getResource(resource);
        assertNotNull(url);

        try {
            final Properties properties = System.getProperties();
            properties.load(url.openStream());

            properties.setProperty("killbill.payment.provider.default", PLUGIN_TEST_NAME);
            properties.setProperty("killbill.payment.engine.events.off", "false");

            configSource = new SimplePropertyConfigSource(properties);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private static final class MapConfigSource implements ConfigSource {
        private final Map<String, String> map;

        private MapConfigSource(final Map<String, String> map) {
            this.map = map;
        }

        @Override
        public String getString(final String propertyName) {
            return map.get(propertyName);
        }
    }

    @Override
    protected void installPaymentDao() {
        bind(PaymentDao.class).to(MockPaymentDao.class).asEagerSingleton();
    }

    @Override
    protected void installPaymentProviderPlugins(final PaymentConfig config) {
        install(new MockPaymentProviderPluginModule(PLUGIN_TEST_NAME));
    }

    @Override
    protected void configure() {
        loadSystemPropertiesFromClasspath("/payment.properties");
        super.configure();
        install(new BusModule(BusType.MEMORY));
        install(new MockNotificationQueueModule());
        install(new MockInvoiceModule());
        install(new TestDbiModule());
        install(new TagStoreModule());
        bind(GlobalLocker.class).to(MockGlobalLocker.class).asEagerSingleton();
    }
}

@@ -757,16 +757,67 @@
 erties;%0A
+import java.util.UUID;%0A%0Aimport org.mockito.Mockito;
 %0Aimport 
@@ -896,24 +896,71 @@
 figSource;%0A%0A
+import com.google.common.collect.ImmutableMap;%0A
 import com.n
@@ -1113,57 +1113,8 @@
 le;%0A
-import com.ning.billing.mock.glue.TestDbiModule;%0A
 impo
@@ -1275,32 +1275,122 @@
 erPluginModule;%0A
+import com.ning.billing.util.api.TagUserApi;%0Aimport com.ning.billing.util.dao.ObjectType;%0A
 import com.ning.
@@ -1620,27 +1620,15 @@
 til.
-glue.TagStoreModule
+tag.Tag
 ;%0A%0Ai
@@ -3404,32 +3404,33 @@
 eModule());%0A
+%0A
         
 install(new 
@@ -3421,77 +3421,259 @@
     
+f
 in
-stall(new TestDbiModule());%0A        install(new TagStoreModule
+al TagUserApi tagUserApi = Mockito.mock(TagUserApi.class);%0A        bind(TagUserApi.class).toInstance(tagUserApi);%0A        Mockito.when(tagUserApi.getTags(Mockito.%3CUUID%3Eany(), Mockito.%3CObjectType%3Eany())).thenReturn(ImmutableMap.%3CString, Tag%3Eof
 ());%0A
+%0A
     

fix tests failures