package com.infoclinika.pdx.controller;

import com.infoclinika.pdx.projection.protein.ProteinSummary;
import com.infoclinika.pdx.service.annotation.PrimarySiteService;
import com.infoclinika.pdx.service.protein.ProteinService;
import com.infoclinika.pdx.specification.FilterQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * Handles requests to get Protein data.
 */
@RestController
@RequestMapping("/api/protein")
public class ProteinController {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    private final ProteinService proteinService;
    private final PrimarySiteService primarySiteService;

    /**
     * Constructor to provide required services.
     */
    @Autowired
    public ProteinController(ProteinService proteinService, PrimarySiteService primarySiteService) {
        this.proteinService = proteinService;
        this.primarySiteService = primarySiteService;
    }

    /**
     * Returns Protein data for provided filter options.
     */
    @GetMapping("/data")
    @ResponseStatus(HttpStatus.OK)
    public List<ProteinSummary> getData(@RequestParam(name = "queries", required = false) List<FilterQuery> queries) {
        logger.debug("Request to /api/protein/data?queries={}", queries);

        final List<FilterQuery> filterQueries = primarySiteService.getQueriesWithIgnoredCategories(queries);
        return proteinService.getProteinData(filterQueries);
    }
}
