package com.infoclinika.pdx.controller;

import com.infoclinika.pdx.projection.EntityTypeDto;
import com.infoclinika.pdx.projection.PathwayWithGenes;
import com.infoclinika.pdx.service.experiment.PathwayService;
import com.infoclinika.pdx.specification.FilterQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
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 pathways.
 */
@RestController
@RequestMapping("/api/pathway")
public class PathwayController {
    private static final String EMPTY_STRING = "";
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    private final PathwayService pathwayService;

    /**
     * Constructor to provide required services.
     */
    @Autowired
    public PathwayController(PathwayService pathwayService) {
        this.pathwayService = pathwayService;
    }

    /**
     * Returns pathways that contain provided name.
     */
    @GetMapping("/search")
    public List<EntityTypeDto> searchPathways(@RequestParam(name = "name", required = false) String name) {
        logger.debug("Request to /api/pathway/search/", name);
        final String searchString = Optional.ofNullable(name)
                                            .orElse(EMPTY_STRING);
        return pathwayService.findPathways(searchString);
    }

    /**
     * Returns genes content for selected pathways.
     */
    @PostMapping("/genes")
    public Page<PathwayWithGenes> getGeneContent(
            @RequestParam(name = "query", required = false) FilterQuery query, Pageable pageable) {
        logger.debug("Request to /api/pathway/genes/", query);

        final FilterQuery filterQuery = Optional.ofNullable(query)
                                                .orElse(new FilterQuery(newArrayList()));
        return pathwayService.getGeneContent(filterQuery, pageable);
    }
}
