package pwc.taxtech.atms.common.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import pwc.taxtech.atms.dao.FormulaAdminMapper;
import pwc.taxtech.atms.dao.OrganizationMapper;
import pwc.taxtech.atms.dao.ProjectDao;
import pwc.taxtech.atms.dao.ProjectMapper;
import pwc.taxtech.atms.dao.ProjectServiceTypeMapper;
import pwc.taxtech.atms.invoice.InputInvoiceMapper;
import pwc.taxtech.atms.invoice.OutputInvoiceDetailMapper;
import pwc.taxtech.atms.invoice.OutputInvoiceMapper;
import pwc.taxtech.atms.service.impl.DistributedIdService;
import pwc.taxtech.atms.vat.dao.*;
import pwc.taxtech.atms.vat.entity.OutputInvoiceDetail;

//用来获取spring托管的bean
@Component
public class SpringContextUtil implements ApplicationContextAware {

    private static ApplicationContext webApplicationContext;

    public static FormulaAdminMapper formulaAdminMapper;
    public static PeriodReportMapper reportMapper;
    public static CellDataMapper cellDataMapper;
    public static PeriodCellDataMapper periodCellDataMapper;
    public static DistributedIdService distributedIdService;
    public static PeriodFormulaBlockMapper formulaBlockMapper;
    public static PeriodCellTemplateMapper periodCellTemplateMapper;
    public static ProjectServiceTypeMapper projectServiceTypeMapper;
    public static PeriodTemplateMapper periodTemplateMapper;
    public static PeriodStandardAccountMapper periodStandardAccountMapper;
    public static ProjectDao projectDao;
    public static BalanceMapper balanceMapper;
//    public static DataSourceMapper dataSourceMapper;
    public static PeriodDataSourceMapper periodDataSourceMapper;
//    public static DataSourceDetailMapper dataSourceDetailMapper;
    public static PeriodDataSourceDetailMapper periodDataSourceDetailMapper;
    public static PeriodFormulaBlockMapper periodFormulaBlockMapper;
    public static VatEnterpriseAccountDao vatEnterpriseAccountDao;
    public static VatEnterpriseAccountMapper vatEnterpriseAccountMapper;
    public static PeriodEnterpriseAccountMapper periodEnterpriseAccountMapper;
    public static BalanceStdManualMapper balanceStdManualMapper;
    public static OutputInvoiceMapper outputInvoiceMapper;
    public static OutputInvoiceDetailMapper outputInvoiceDetailMapper;
    public static PeriodTaxRuleSettingMapper periodTaxRuleSettingMapper;
    public static InputInvoiceDao inputInvoiceDao;
    public static InputInvoiceMapper inputInvoiceMapper;
    public static InputVatInvoiceMapper inputVatInvoiceMapper;
    public static AssetsListMapper assetsListMapper;
    public static ProjectMapper projectMapper;
    public static CellDataSourceMapper cellDataSourceMapper;
    public static PeriodCellDataSourceMapper periodCellDataSourceMapper;
    public static OrganizationMapper organizationMapper;

    /**
     * 获取bean
     *
     * @param requiredType
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> requiredType) {
        return SpringContextUtil.webApplicationContext.getBean(requiredType);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        webApplicationContext = applicationContext;
        formulaAdminMapper = webApplicationContext.getBean(FormulaAdminMapper.class);
        reportMapper = webApplicationContext.getBean(PeriodReportMapper.class);
        cellDataMapper = webApplicationContext.getBean(CellDataMapper.class);
        periodCellDataMapper = webApplicationContext.getBean(PeriodCellDataMapper.class);
        distributedIdService = webApplicationContext.getBean(DistributedIdService.class);
        formulaBlockMapper = webApplicationContext.getBean(PeriodFormulaBlockMapper.class);
        periodCellTemplateMapper = webApplicationContext.getBean(PeriodCellTemplateMapper.class);
        projectServiceTypeMapper = webApplicationContext.getBean(ProjectServiceTypeMapper.class);
        periodTemplateMapper = webApplicationContext.getBean(PeriodTemplateMapper.class);
//        periodStandardAccountMapper = webApplicationContext.getBean(PeriodStandardAccountMapper.class);
        periodStandardAccountMapper = webApplicationContext.getBean(PeriodStandardAccountMapper.class);
        projectDao = webApplicationContext.getBean(ProjectDao.class);
        balanceMapper = webApplicationContext.getBean(BalanceMapper.class);
//        dataSourceMapper = webApplicationContext.getBean(DataSourceMapper.class);
        periodDataSourceMapper = webApplicationContext.getBean(PeriodDataSourceMapper.class);
//        dataSourceDetailMapper = webApplicationContext.getBean(DataSourceDetailMapper.class);
        periodDataSourceDetailMapper = webApplicationContext.getBean(PeriodDataSourceDetailMapper.class);
        periodFormulaBlockMapper = webApplicationContext.getBean(PeriodFormulaBlockMapper.class);
        vatEnterpriseAccountDao = webApplicationContext.getBean(VatEnterpriseAccountDao.class);
        vatEnterpriseAccountMapper = webApplicationContext.getBean(VatEnterpriseAccountMapper.class);
        periodEnterpriseAccountMapper = webApplicationContext.getBean(PeriodEnterpriseAccountMapper.class);
        balanceStdManualMapper = webApplicationContext.getBean(BalanceStdManualMapper.class);
//        outputVatInvoiceMapper = webApplicationContext.getBean(OutputVatInvoiceMapper.class);
        outputInvoiceMapper = webApplicationContext.getBean(OutputInvoiceMapper.class);
        outputInvoiceDetailMapper = webApplicationContext.getBean(OutputInvoiceDetailMapper.class);
        periodTaxRuleSettingMapper = webApplicationContext.getBean(PeriodTaxRuleSettingMapper.class);
//        inputVatInvoiceDao = webApplicationContext.getBean(InputVatInvoiceDao.class);
        inputVatInvoiceMapper = webApplicationContext.getBean(InputVatInvoiceMapper.class);
        inputInvoiceDao = webApplicationContext.getBean(InputInvoiceDao.class);
        inputInvoiceMapper = webApplicationContext.getBean(InputInvoiceMapper.class);
        assetsListMapper = webApplicationContext.getBean(AssetsListMapper.class);
        projectMapper = webApplicationContext.getBean(ProjectMapper.class);
        cellDataSourceMapper = webApplicationContext.getBean(CellDataSourceMapper.class);
        periodCellDataSourceMapper = webApplicationContext.getBean(PeriodCellDataSourceMapper.class);
        organizationMapper = webApplicationContext.getBean(OrganizationMapper.class);
    }
}