package io.delphiplatform.api.v3.view;

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

import io.delphiplatform.api.v3.model.ads.AdMeta;
import io.delphiplatform.api.v3.model.ads.AdPerformanceSummaryItem;
import io.delphiplatform.api.v3.model.ads.AdPerformanceSummaryItems;
import io.delphiplatform.api.v3.model.ads.AdsCampaignsBudgetItems;
import io.delphiplatform.api.v3.model.ads.AdsSetBudgetItems;
import io.delphiplatform.api.v3.model.datahealth.AdsDataHealthRangeReport;
import io.delphiplatform.api.v3.model.datahealth.AdsDataHealthStatusReport;
import io.delphiplatform.api.v3.model.datahealth.DataHealthStatusSummary;
import io.delphiplatform.api.v3.rdb.service.AdsDataHealthStatusAnalyticsService;
import io.delphiplatform.api.v3.rdb.service.AdsDataHealthStatusService;
import io.delphiplatform.api.v3.rdb.service.ads.AdsBudgetTypeService;
import io.delphiplatform.api.v3.rdb.service.ads.AdsPerformanceSummaryItemsService;
import io.delphiplatform.api.v3.view.util.Params;

@Controller
@RequestMapping("${spring.data.rest.base-path:/v3}")
public class AdsApiController implements AdsApi {

    private final AdsPerformanceSummaryItemsService adsPerformanceSummaryItemsService;

    private final AdsDataHealthStatusService adsDataHealthStatusService;

    private final AdsDataHealthStatusAnalyticsService adsDataHealthStatusAnalyticsService;

    private final AdsBudgetTypeService adsBudgetTypeService;

    public AdsApiController(AdsPerformanceSummaryItemsService adsPerformanceSummaryItemsService,
        AdsDataHealthStatusService adsDataHealthStatusService,
        AdsDataHealthStatusAnalyticsService adsDataHealthStatusAnalyticsService, AdsBudgetTypeService adsBudgetTypeService) {
        this.adsPerformanceSummaryItemsService = adsPerformanceSummaryItemsService;
        this.adsDataHealthStatusService = adsDataHealthStatusService;
        this.adsDataHealthStatusAnalyticsService = adsDataHealthStatusAnalyticsService;
        this.adsBudgetTypeService = adsBudgetTypeService;
    }


    @Override
    public ResponseEntity<AdPerformanceSummaryItems> getSearchData(Params params) {
        List<AdPerformanceSummaryItem> models = adsPerformanceSummaryItemsService.getModels(params);
        AdMeta adMeta = adsPerformanceSummaryItemsService.getMeta(params);
        return ResponseEntity.ok(new AdPerformanceSummaryItems()
            .items(models)
            .meta(adMeta)
            .nextCursor(params.getNextCursor())
            .count((long) models.size()));
    }

    @Override
    public ResponseEntity<AdsDataHealthStatusReport<DataHealthStatusSummary>> getAdsDataHealthStatus(Params params) {
        return ResponseEntity.ok(adsDataHealthStatusService.getAdsDataHealthStatusReport(params));
    }

    @Override
    public ResponseEntity<AdsDataHealthRangeReport> getAdsDataHealthStatusAnalytics(Params params) {
        return ResponseEntity.ok(adsDataHealthStatusAnalyticsService.getDataHealthRangeReport(params));
    }

    @Override
    public ResponseEntity<AdsCampaignsBudgetItems> adsCampaignsBudgetsSearch(Params params) {
        return ResponseEntity.ok(new AdsCampaignsBudgetItems(adsBudgetTypeService.getCampaignsBudgets(params)));
    }

    @Override
    public ResponseEntity<AdsSetBudgetItems> adsSetBudgetsSearch(Params params) {
        return ResponseEntity.ok(new AdsSetBudgetItems(adsBudgetTypeService.getAdSetBudgets(params)));
    }
}

