package io.delphiplatform.api.v3.view;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.server.ResponseStatusException;

import java.util.List;

import io.delphiplatform.api.util.CollectionUtils;
import io.delphiplatform.api.v3.model.amazon.AmazonChart;
import io.delphiplatform.api.v3.model.amazon.AmazonChartPositions;
import io.delphiplatform.api.v3.model.amazon.AmazonChartTrackPosition;
import io.delphiplatform.api.v3.model.amazon.AmazonChartTrackSummaries;
import io.delphiplatform.api.v3.model.amazon.AmazonChartTrackSummary;
import io.delphiplatform.api.v3.model.amazon.AmazonCharts;
import io.delphiplatform.api.v3.model.datahealth.AmazonChartsDataHealthStatusReport;
import io.delphiplatform.api.v3.model.datahealth.AmazonDataHealthStatusSummary;
import io.delphiplatform.api.v3.rdb.service.amazon.AmazonChartService;
import io.delphiplatform.api.v3.rdb.service.amazon.AmazonChartSummaryService;
import io.delphiplatform.api.v3.rdb.service.amazon.AmazonChartTrackPositionService;
import io.delphiplatform.api.v3.rdb.service.amazon.AmazonChartsDataHealthStatusService;
import io.delphiplatform.api.v3.view.util.Params;

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

    private final AmazonChartsDataHealthStatusService dataHealthStatusService;
    private final AmazonChartService amazonChartService;
    private final AmazonChartTrackPositionService amazonChartTrackPositionService;
    private final AmazonChartSummaryService amazonChartSummaryService;

    @Autowired
    public AmazonChartsApiController(AmazonChartService amazonChartService,
        AmazonChartTrackPositionService amazonChartTrackPositionService,
        AmazonChartSummaryService amazonChartSummaryService,
        AmazonChartsDataHealthStatusService dataHealthStatusService) {
        this.amazonChartService = amazonChartService;
        this.amazonChartTrackPositionService = amazonChartTrackPositionService;
        this.amazonChartSummaryService = amazonChartSummaryService;
        this.dataHealthStatusService = dataHealthStatusService;
    }

    @Override
    public ResponseEntity<AmazonCharts> getAmazonCharts(Params params) {
        List<AmazonChart> amazonCharts = amazonChartService.getAmazonCharts(params);
        return ResponseEntity.ok(new AmazonCharts(amazonCharts));
    }

    @Override
    public ResponseEntity<AmazonChartPositions> getAmazonChartsTrackPositions(Params params) {
        List<AmazonChartTrackPosition> positions = amazonChartTrackPositionService.getAmazonChartTrackPositions(params);
        return ResponseEntity.ok(new AmazonChartPositions()
            .count(positions.size())
            .items(positions)
            .nextCursor(params.getNextCursor())
        );
    }

    @Override
    public ResponseEntity<AmazonChartTrackSummaries> getAmazonChartsTrackPositionsSummary(Params params) {
        List<AmazonChartTrackSummary> items = amazonChartSummaryService.getAmazonChartTrackSummaries(params);

        return ResponseEntity.ok(new AmazonChartTrackSummaries()
            .count(items.size())
            .items(items)
        );
    }

    @Override
    public ResponseEntity<AmazonChartsDataHealthStatusReport<AmazonDataHealthStatusSummary>> getAmazonMusicChartsDataHealthStatus(
        Params params) {
        return ResponseEntity.ok(dataHealthStatusService.getAmzonChartsDataHealthStatus(params));
    }

    @Override
    public void validateParams(Params params) {
        String msg = null;

        if (CollectionUtils.isEmpty(params.getChartId())
            && CollectionUtils.isEmpty(params.getIsrc())
            && CollectionUtils.isEmpty(params.getTrackId())) {
            msg = "Missing at least one identifiying parameter from set: [chart_id, isrc, track_id]";
        }

        if (CollectionUtils.isNotEmpty(params.getIsrc())
            && CollectionUtils.isNotEmpty(params.getTrackId())) {
            msg = "Invalid parameters: forbidden to use 'isrc' and 'track_id' at the same time";
        }

        if (msg != null) {
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, msg);
        }
    }
}