/*
 * Copyright 2011 Alibaba.com All right reserved. This software is the
 * confidential and proprietary information of Alibaba.com ("Confidential
 * Information"). You shall not disclose such Confidential Information and shall
 * use it only in accordance with the terms of the license agreement you entered
 * into with Alibaba.com.
 */
package com.alibaba.dubbo.governance.web.governance.module.screen;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import com.alibaba.dubbo.common.utils.CollectionUtils;
import com.alibaba.dubbo.governance.service.OverrideService;
import com.alibaba.dubbo.governance.service.ProviderService;
import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
import com.alibaba.dubbo.registry.common.domain.LoadBalance;
import com.alibaba.dubbo.registry.common.domain.Provider;
import com.alibaba.dubbo.registry.common.util.OverrideUtils;
import com.alibaba.dubbo.registry.common.util.Tool;

/**
 * Providers.
 * URI: /services/$service/loadbalances
 * 
 * @author william.liangf
 */
public class Loadbalances extends Restful {
    
    @Autowired
    private OverrideService overrideService;
    
    @Autowired
    private ProviderService providerService;

    public void index(Map<String, Object> context) {
        final String service = StringUtils.trimToNull((String) context.get("service"));
        
        List<LoadBalance> loadbalances;
        if (service != null && service.length() > 0) {
            loadbalances = OverrideUtils.overridesToLoadBalances(overrideService.findByService(service));
            
            loadbalances = OverrideUtils.overridesToLoadBalances(overrideService.findByService(service));
        } else {
            loadbalances = OverrideUtils.overridesToLoadBalances(overrideService.findAll());
        }
        context.put("loadbalances", loadbalances);
    }

    public void show(Long id, Map<String, Object> context) {
    	LoadBalance loadbalance = OverrideUtils.overrideToLoadBalance(overrideService.findById(id));
        context.put("loadbalance", loadbalance);
    }
    
    public void add(Map<String, Object> context) {
        String service = (String)context.get("service");
        if (service != null && service.length() > 0 && !service.contains("*")) {
            List<Provider> providerList = providerService.findByService(service);
            List<String> addressList = new ArrayList<String>();
            for(Provider provider : providerList){
                addressList.add(provider.getUrl().split("://")[1].split("/")[0]);
            }
            context.put("addressList", addressList);
            context.put("service", service);
            context.put("methods", CollectionUtils.sort(providerService.findMethodsByService(service)));
        } else {
            List<String> serviceList = Tool.sortSimpleName(providerService.findServices());
            context.put("serviceList", serviceList);
        }
        if(context.get("input") != null) context.put("input", context.get("input"));
    }

    public void edit(Long id, Map<String, Object> context) {
    	 add(context);
         show(id, context);
    }
    
    public boolean create(LoadBalance loadBalance, Map<String, Object> context) {
        if (!super.currentUser.hasServicePrivilege(loadBalance.getService())) {
            context.put("message", getMessage("HaveNoServicePrivilege", loadBalance.getService()));
            return false;
        }
        
    	loadBalance.setUsername((String)context.get("operator"));
    	overrideService.saveOverride(OverrideUtils.loadBalanceToOverride(loadBalance));
        return true;
    }

    
    public boolean update(LoadBalance loadBalance, Map<String, Object> context) {
        if (!super.currentUser.hasServicePrivilege(loadBalance.getService())) {
            context.put("message", getMessage("HaveNoServicePrivilege", loadBalance.getService()));
            return false;
        }
    	overrideService.updateOverride(OverrideUtils.loadBalanceToOverride(loadBalance));
        return true;
    }

    /**
     * 删除动作
     * @param ids
     * @return
     */
    public boolean delete(Long[] ids, Map<String, Object> context) {
        for (Long id : ids) {
            LoadBalance lb = OverrideUtils.overrideToLoadBalance(overrideService.findById(id));
            if (!super.currentUser.hasServicePrivilege(lb.getService())) {
                context.put("message", getMessage("HaveNoServicePrivilege", lb.getService()));
                return false;
            }
        }
        
        for (Long id : ids) {
        	overrideService.deleteOverride(id);
        }
        return true;
    }

}