package com.infoclinika.pdx.controller;

import com.infoclinika.pdx.projection.CellTypeWithGenes;
import com.infoclinika.pdx.projection.EntityTypeDto;
import com.infoclinika.pdx.service.experiment.MicroenvironmentService;
import com.infoclinika.pdx.specification.FilterQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Optional;

import static com.google.common.collect.Lists.newArrayList;

/**
 * Handles requests for microenvironment data.
 */
@RestController
@RequestMapping("/api/microenvironment")
public class MicroenvironmentController {
    private static final String EMPTY_STRING = "";
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    private final MicroenvironmentService microenvironmentService;

    /**
     * Constructor to provide required services.
     */
    @Autowired
    public MicroenvironmentController(MicroenvironmentService microenvironmentService) {
        this.microenvironmentService = microenvironmentService;
    }

    /**
     * Returns list of cell types that contain provided name.
     */
    @GetMapping("/search")
    public List<EntityTypeDto> searchCellTypes(
            @RequestParam(name = "name", required = false) String name) {
        logger.debug("Request to /api/microenvironment/search?name={}", name);

        final String searchString = Optional.ofNullable(name)
                                            .orElse(EMPTY_STRING);
        return microenvironmentService.findCellTypes(searchString);
    }

    /**
     * Returns genes content for selected cell types.
     */
    @PostMapping("/genes")
    public List<CellTypeWithGenes> getGeneContent(
            @RequestParam(name = "query", required = false) FilterQuery query) {
        logger.debug("Request to /api/microenvironment/genes/", query);

        final FilterQuery filterQuery = Optional.ofNullable(query)
                                                .orElse(new FilterQuery(newArrayList()));
        return microenvironmentService.getGeneContent(filterQuery);
    }
}
