/*
 * Copyright 1999-2011 Alibaba Group.
 *  
 * Licensed 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.alibaba.dubbo.config.url.test;


import java.util.Arrays;

import org.junit.Assert;

import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerFactory;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.MethodConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.ProviderConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;
import com.alibaba.dubbo.config.api.DemoService;
import com.alibaba.dubbo.config.provider.impl.DemoServiceImpl;
import com.alibaba.dubbo.config.support.RpcConfigGetSetProxy;

/**
 * @author haomin.liuhm
 *
 */

@SuppressWarnings("unused")
public class UrlTestBase {
    
    private static final Logger log = LoggerFactory.getLogger(UrlTestBase.class);

    // ======================================================
    //   data column definition
    // ====================================================== 
    protected static final int KEY = 0;
    protected static final int URL_KEY = 1;
    private static final int TYPE = 2;
    private static final int DEFAULT = 3;
    protected static final int TESTVALUE1 = 4;
    private static final int TESTVALUE2 = 5;
    private static final int TESTVALUE3 = 6;
    private static final int TESTVALUE4 = 7;
    private static final int TESTVALUE5 = 8;
    private static final int TESTVALUE6 = 9;
    private static final int TESTVALUE7 = 10;
    protected ApplicationConfig appConfForProvider;
    protected ApplicationConfig appConfForService;
    protected RegistryConfig regConfForProvider;
    protected RegistryConfig regConfForService;
    protected ProviderConfig provConf;
    protected ProtocolConfig protoConfForProvider;
    protected ProtocolConfig protoConfForService;
    protected MethodConfig methodConfForService;
    protected ServiceConfig<DemoService> servConf;
    protected Object servConfTable[][] = {
            {"proxy", "proxy", "string", "javassist", "jdk", "javassist", "", "", "", ""}, 
            {"actives", "actives", "int", 0, 90, "", "", "", "", ""}, 
            {"executes", "executes", "int", 0, 90, "", "", "", "", ""}, 
            {"deprecated", "deprecated", "boolean", false, true, "", "", "", "", ""}, 
            {"dynamic", "dynamic", "boolean", true, false, "", "", "", "", ""},
            {"accesslog", "accesslog", "string", "", "haominTest", "", "", "", "", ""}, 
            {"document", "document", "string", "", "http://b2b-doc.alibaba-inc.com/display/RC/dubbo_devguide.htm?testquery=你好你好", "", "", "", "", ""},
            {"weight", "weight", "int", 0, 90, "", "", "", "", ""},
            
            //{"filter", "service.filter", "string", "", "", "", "", "", "", ""},
            //{"listener", "listener", "string", "", "", "", "", "", "", ""},
            
            };

    private Object appConfForProviderTable[][] = {
                {"", "", "", "", "", "", "", "", "", ""}, 
            };
    private Object appConfForServiceTable[][] = {
                {"", "", "", "", "", "", "", "", "", ""}, 
            };
    private Object regConfForProviderTable[][] = {
                {"", "", "", "", "", "", "", "", "", ""}, 
            };
    protected Object regConfForServiceTable[][] = {
    //            {"timeout", "registry.timeout", "int", 5000, 9000, "", "", "", "", ""}, 
    //            {"file", "registry.file", "string", "", "regConfForServiceTable.log", "", "", "", "", ""}, 
    //            {"wait", "registry.wait", "int", 0, 9000, "", "", "", "", ""}, 
    //            {"transport", "registry.transporter", "string", "netty", "mina", "", "", "", "", ""}, 
    //            {"subscribe", "subscribe", "boolean", true, false, "", "", "", "", ""}, 
                {"dynamic", "dynamic", "boolean", true, false, "", "", "", "", ""},
            };
    private Object protoConfForProviderTable[][] = {
                {"", "", "", "", "", "", "", "", "", ""}, 
            };
    private Object protoConfForServiceTable[][] = {
                {"", "", "", "", "", "", "", "", "", ""}, 
            };
    protected Object provConfTable[][] = {
                {"cluster", "default.cluster", "string", "string", "failover", "failfast", "failsafe", "", "", ""}, 
                {"async", "default.async", "boolean", false, true, "", "", "", "", ""},
                {"loadbalance", "default.loadbalance", "string", "random", "leastactive", "", "", "", "", ""},
                {"connections", "default.connections", "int", 0, 60, "", "", "", "", ""},
                {"retries", "default.retries", "int", 2, 60, "", "", "", "", ""},
                {"timeout", "default.timeout", "int", 5000, 60, "", "", "", "", ""},
                //change by fengting listener 没有缺省值
                //{"listener", "exporter.listener", "string", "", "", "", "", "", "", ""},
                //{"filter", "service.filter", "string", "", "", "", "", "", "", ""},
                           
            };
    protected Object methodConfForServiceTable[][] = {
                {"actives", "sayName.actives", "int", 0, 90, "", "", "", "", ""}, 
                {"executes", "sayName.executes", "int", 0, 90, "", "", "", "", ""}, 
                {"deprecated", "sayName.deprecated", "boolean", false, true, "", "", "", "", ""}, 
                {"async", "sayName.async", "boolean", false, true, "", "", "", "", ""}, 
                {"timeout", "sayName.timeout", "int", 0, 90, "", "", "", "", ""}, 
            };
    protected DemoService demoService = new DemoServiceImpl();
    
    // ======================================================
    //   data table manipulation utils
    // ====================================================== 
    protected String genParamString(Object urlKey, Object value) {
        
        return (String)urlKey + "=" + value.toString();
    }

    protected <T> void fillConfigs(T conf, Object[][] table, int column) {
        
        for(Object[] row : table){
            fillConfig(conf, row, column);
        }
    }

    protected <T> void fillConfig(T conf, Object[] row, int column) {
        
        RpcConfigGetSetProxy proxy = new RpcConfigGetSetProxy(conf);
        proxy.setValue((String)row[KEY], row[column]);
        
    }

    @SuppressWarnings("deprecation")
    protected void initServConf() {
        
        appConfForProvider = new ApplicationConfig();
        appConfForService = new ApplicationConfig();
        regConfForProvider = new RegistryConfig();
        regConfForService = new RegistryConfig();
        provConf = new ProviderConfig();
        protoConfForProvider = new ProtocolConfig();
        protoConfForService = new ProtocolConfig();
        methodConfForService = new MethodConfig();
        servConf = new ServiceConfig<DemoService>();
        
        provConf.setApplication(appConfForProvider);
        servConf.setApplication(appConfForService);
        
        provConf.setRegistry(regConfForProvider);
        servConf.setRegistry(regConfForService);
        
        provConf.setProtocols(Arrays.asList(new ProtocolConfig[]{protoConfForProvider}));
        servConf.setProtocols(Arrays.asList(new ProtocolConfig[]{protoConfForService}));
        
        servConf.setMethods(Arrays.asList(new MethodConfig[]{methodConfForService}));
        servConf.setProvider(provConf);
        
        servConf.setRef(demoService);
        servConf.setInterfaceClass(DemoService.class);
       
        methodConfForService.setName("sayName");
        regConfForService.setAddress("127.0.0.1:9090");
        regConfForService.setProtocol("mockregistry");
        appConfForService.setName("ConfigTests");
    }

    protected String getProviderParamString() {
        return servConf.getExportedUrls().get(0).toString(); 
    }

    /**
     * @param paramStringFromDb
     * @param dataTable
     * @param configName
     * @param column
     */
    protected void assertUrlStringWithLocalTable(String paramStringFromDb, 
                                                 Object[][] dataTable, String configName, int column) {
        final String FAILLOG_HEADER = "The following config items are not found in URL: ";
        
        log.warn("Verifying service url for " + configName + "... ");
        log.warn("Consumer url string: " + paramStringFromDb);
        
        String failLog = FAILLOG_HEADER;
        for(Object[] row : dataTable){
            
            String targetString = genParamString(row[URL_KEY], row[column]);
            
            log.warn("Checking " + (String)row[KEY] + "for" + targetString);
            if (paramStringFromDb.contains(targetString)){
                log.warn((String)row[KEY] + " --> " + targetString + " OK!");
            } else {
                failLog += targetString + ", ";
            }
        }
                                                        
        if( !failLog.equals(FAILLOG_HEADER)){
            Assert.fail(failLog);
        }
    }

}