package ph.fingra.statisticsweb.service;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ph.fingra.statisticsweb.dao.ComponentsDao;
import ph.fingra.statisticsweb.dao.CountryDao;
import ph.fingra.statisticsweb.domain.ActualData;
import ph.fingra.statisticsweb.domain.Component;
import ph.fingra.statisticsweb.domain.Components;
import ph.fingra.statisticsweb.domain.ComponentsGroup;
import ph.fingra.statisticsweb.domain.ComponentsManage;
import ph.fingra.statisticsweb.domain.CountryData;
import ph.fingra.statisticsweb.domain.DashBoardSearchParam;
import ph.fingra.statisticsweb.domain.FingraphSearchParam;
import ph.fingra.statisticsweb.domain.MsDropDown;
import ph.fingra.statisticsweb.domain.TimeOfDayData;
import ph.fingra.statisticsweb.domain.TopCountriesData;
@Service
public class ComponentsServiceImpl implements ComponentsService {
@Autowired
private ComponentsDao componentsDao;
@Autowired
private CountryDao countryDao;
@Override
public List<Components> getNewUsersTotalList(FingraphSearchParam searchParam) {
return componentsDao.getNewUsersTotalList(searchParam);
}
@Override
public List<TimeOfDayData> getTimeOfDayTotalList(FingraphSearchParam searchParam) {
return componentsDao.getTimeOfDayTotalList(searchParam);
}
@Override
public List<HashMap> getNewUsersDailyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getNewUsersDailyTimeSeriesList(searchParam);
}
@Override
public List<HashMap> getNewUsersWeeklyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getNewUsersWeeklyTimeSeriesList(searchParam);
}
@Override
public List<HashMap> getNewUsersMonthlyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getNewUsersMonthlyTimeSeriesList(searchParam);
}
@Override
public List<Components> getActiveUsersTotalList(FingraphSearchParam searchParam) {
return componentsDao.getActiveUsersTotalList(searchParam);
}
@Override
public List<HashMap> getActiveUsersDailyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getActiveUsersDailyTimeSeriesList(searchParam);
}
@Override
public List<HashMap> getActiveUsersWeeklyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getActiveUsersWeeklyTimeSeriesList(searchParam);
}
@Override
public List<HashMap> getActiveUsersMonthlyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getActiveUsersMonthlyTimeSeriesList(searchParam);
}
@Override
public List<Components> getPageViewsTotalList(FingraphSearchParam searchParam) {
return componentsDao.getPageViewsTotalList(searchParam);
}
@Override
public List<HashMap> getPageViewsDailyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getPageViewsDailyTimeSeriesList(searchParam);
}
@Override
public List<HashMap> getPageViewsWeeklyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getPageViewsWeeklyTimeSeriesList(searchParam);
}
@Override
public List<HashMap> getPageViewsMonthlyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getPageViewsMonthlyTimeSeriesList(searchParam);
}
@Override
public String getTimeOfDayMaxTime(FingraphSearchParam searchParam) {
return componentsDao.getTimeOfDayMaxTime(searchParam);
}
@Override
public List<ActualData> getTimeOfDayActualDataList(FingraphSearchParam searchParam) {
List<ActualData> alist = componentsDao.getTimeOfDayActualDataList(searchParam);
if(alist.size()>0){
BigDecimal componentTotal = new BigDecimal(0);
for(ActualData ad: alist){//component 합
componentTotal = componentTotal.add(ad.getActual());
}
for(ActualData ad: alist){
if(componentTotal.compareTo(new BigDecimal(0))==1){
ad.setPercentAllCom((ad.getActual().divide(componentTotal,MathContext.DECIMAL32)).multiply(new BigDecimal(100)));
}
}
}
return alist;
}
@Override
public TopCountriesData getTopCountriesData(FingraphSearchParam searchParam) {
TopCountriesData data = new TopCountriesData();
List<CountryData> sumList = new ArrayList<>();
if("daily".equals(searchParam.getTerm())){
sumList = countryDao.getCountrySessionsDailySumList(searchParam);
}else if("weekly".equals(searchParam.getTerm())){
sumList = countryDao.getCountrySessionsWeeklySumList(searchParam);
}else if("monthly".equals(searchParam.getTerm())){
sumList = countryDao.getCountrySessionsMonthlySumList(searchParam);
}
List<MsDropDown> list = new ArrayList<>();
if(sumList.size()>0){
List<String> topNList = new ArrayList();
if(sumList.size()>5){// get top5 countries from all countries.
for(int i=0 ; i<5 ; i++){
topNList.add(i, sumList.get(i).getIso2());
MsDropDown ms = new MsDropDown();// country select box
ms.setValue(sumList.get(i).getIso2());
ms.setText(sumList.get(i).getCountry());
list.add(ms);
}
}else{
for(int i=0 ; i<sumList.size() ; i++){
topNList.add(i, sumList.get(i).getIso2());
MsDropDown ms = new MsDropDown();// country select box
ms.setValue(sumList.get(i).getIso2());
ms.setText(sumList.get(i).getCountry());
list.add(ms);
}
}
for(int i=0 ; i<topNList.size();i++){
System.out.println(topNList.get(i));
}
searchParam.setTopNList(topNList);// set top5 countries to the search list.
List<HashMap> tlist = componentsDao.getTopCountriesDailyTotalTopNList(searchParam);
data.setTlist(tlist);
data.setSlist(list);
}
return data;
}
@Override
public List<ActualData> getTopCountriesActualDataList(FingraphSearchParam searchParam) {
List<ActualData> alist = componentsDao.getTopCountriesActualDataList(searchParam);
if(alist.size()>0){
BigDecimal componentTotal = new BigDecimal(0);
for(ActualData ad: alist){//Total of components
componentTotal = componentTotal.add(ad.getActual());
}
for(ActualData ad: alist){
if(componentTotal.compareTo(new BigDecimal(0))==1){
ad.setPercentAllCom((ad.getActual().divide(componentTotal,MathContext.DECIMAL32)).multiply(new BigDecimal(100)));
}
}
}
return alist;
}
@Override
public List<Component> getComponentsList(DashBoardSearchParam param) {
return componentsDao.getComponentsList(param);
}
@Override
public String addComponent(Component event) {
componentsDao.addComponent(event);
return event.getComponentkey();
}
@Override
public void editComponent(Component event) {
componentsDao.editComponent(event);
}
@Override
public void removeComponent(Component event) {
componentsDao.removeComponent(event);
}
@Override
public List<HashMap> getNewUsersInterGroupDailyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getNewUsersInterGroupDailyTimeSeriesList(searchParam);
}
@Override
public List<ActualData> getNewUsersActualDataList(FingraphSearchParam searchParam) {
List<ActualData> alist = componentsDao.getNewUsersActualDataList(searchParam);
if(alist.size()>0){
//Total of Apps
BigDecimal appTotal = componentsDao.getNewUsersAppTotal(searchParam);
BigDecimal componentTotal = new BigDecimal(0);
for(ActualData ad: alist){//Total of Components
componentTotal = componentTotal.add(ad.getActual());
}
for(ActualData ad: alist){
ad.setAppTotal(appTotal);
if(appTotal.compareTo(new BigDecimal(0))==1){
ad.setPercentTotal((ad.getActual().divide(appTotal,MathContext.DECIMAL32)).multiply(new BigDecimal(100)));
}
if(componentTotal.compareTo(new BigDecimal(0))==1){
ad.setPercentAllCom((ad.getActual().divide(componentTotal,MathContext.DECIMAL32)).multiply(new BigDecimal(100)));
}
}
}
return alist;
}
@Override
public List<HashMap> getNewUsersInterGroupWeeklyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getNewUsersInterGroupWeeklyTimeSeriesList(searchParam);
}
@Override
public List<HashMap> getNewUsersInterGroupMonthlyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getNewUsersInterGroupMonthlyTimeSeriesList(searchParam);
}
@Override
public List<ActualData> getActiveUsersActualDataList(FingraphSearchParam searchParam) {
List<ActualData> alist = componentsDao.getActiveUsersActualDataList(searchParam);
if(alist.size()>0){
//Total of Apps
BigDecimal appTotal = componentsDao.getActiveUsersAppTotal(searchParam);
BigDecimal componentTotal = new BigDecimal(0);
for(ActualData ad: alist){//Total of Components
componentTotal = componentTotal.add(ad.getActual());
}
for(ActualData ad: alist){
ad.setAppTotal(appTotal);
if(appTotal.compareTo(new BigDecimal(0))==1){
ad.setPercentTotal((ad.getActual().divide(appTotal,MathContext.DECIMAL32)).multiply(new BigDecimal(100)));
}
if(componentTotal.compareTo(new BigDecimal(0))==1){
ad.setPercentAllCom((ad.getActual().divide(componentTotal,MathContext.DECIMAL32)).multiply(new BigDecimal(100)));
}
}
}
return alist;
}
@Override
public List<HashMap> getActiveUsersInterGroupDailyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getActiveUsersInterGroupDailyTimeSeriesList(searchParam);
}
@Override
public List<HashMap> getActiveUsersInterGroupWeeklyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getActiveUsersInterGroupWeeklyTimeSeriesList(searchParam);
}
@Override
public List<HashMap> getActiveUsersInterGroupMonthlyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getActiveUsersInterGroupMonthlyTimeSeriesList(searchParam);
}
@Override
public List<ActualData> getPageViewsActualDataList(FingraphSearchParam searchParam) {
List<ActualData> alist = componentsDao.getPageViewsActualDataList(searchParam);
if(alist.size()>0){
//Total of Apps.
BigDecimal appTotal = componentsDao.getPageViewsAppTotal(searchParam);
BigDecimal componentTotal = new BigDecimal(0);
for(ActualData ad: alist){//Total of components
componentTotal = componentTotal.add(ad.getActual());
}
for(ActualData ad: alist){
ad.setAppTotal(appTotal);
if(appTotal.compareTo(new BigDecimal(0))==1){
ad.setPercentTotal((ad.getActual().divide(appTotal,MathContext.DECIMAL32)).multiply(new BigDecimal(100)));
}
if(componentTotal.compareTo(new BigDecimal(0))==1){
ad.setPercentAllCom((ad.getActual().divide(componentTotal,MathContext.DECIMAL32)).multiply(new BigDecimal(100)));
}
}
}
return alist;
}
@Override
public List<HashMap> getPageViewsInterGroupDailyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getPageViewsInterGroupDailyTimeSeriesList(searchParam);
}
@Override
public List<HashMap> getPageViewsInterGroupWeeklyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getPageViewsInterGroupWeeklyTimeSeriesList(searchParam);
}
@Override
public List<HashMap> getPageViewsInterGroupMonthlyTimeSeriesList(FingraphSearchParam searchParam) {
return componentsDao.getPageViewsInterGroupMonthlyTimeSeriesList(searchParam);
}
@Override
public List<ComponentsManage> getComponentsManageList(DashBoardSearchParam param) {
List<ComponentsManage> list = componentsDao.getComponentsManageList(param);
// If component list is null, create default component group.
if(list.size()==0){
componentsDao.addComponentsGroup(new ComponentsGroup(param.getAppkey(), 0, "Ungrouped", null, 0));
list = componentsDao.getComponentsManageList(param);
}
return list;
}
@Override
public int getComponentsGroupCountByName(ComponentsGroup group){
return componentsDao.getComponentsGroupCountByName(group);
}
@Override
public ComponentsGroup addComponentsGroup(ComponentsGroup group) {
int groupkey = componentsDao.makeComponentsGroupKey(group);
if(groupkey >= 0){
group.setGroupkey(groupkey);
componentsDao.addComponentsGroup(group);
}
return group;
}
@Override
public void editComponentsGroup(ComponentsGroup componentsGroup) {
componentsDao.updateComponentsGroupName(componentsGroup);
}
@Override
@Transactional
public void removeComponentsGroup(ComponentsGroup componentsGroup) {
//updateGroup - isdel=1
componentsDao.updateComponentsGroupIsdel(componentsGroup);
//updateEvent
componentsDao.updateComponentsIsdel(componentsGroup);
}
@Override
public int getComponentCountByName(Component event) {
return componentsDao.getComponentCountByName(event);
}
@Override
public Component addComponentWithGroup(Component event) {
componentsDao.addComponentWithGroup(event);
return event;
}
@Override
public void removeArrayComponent(HashMap map) {
componentsDao.removeArrayComponent(map);
}
@Override
public List<ComponentsGroup> getComponentsGroupList(String appkey) {
return componentsDao.getComponentsGroupList(appkey);
}
@Override
public void moveArrayComponent(HashMap map) {
componentsDao.moveArrayComponent(map);
}
}