package eu.dnetlib.repo.manager.controllers;

import eu.dnetlib.domain.data.PiwikInfo;
import eu.dnetlib.repo.manager.service.PiWikServiceImpl;
import eu.dnetlib.repo.manager.shared.RepositoryServiceException;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping(value = "/piwik")
@Api(description = "Piwik API",  tags = {"piwik"})
public class PiWikController {

    @Autowired
    PiWikServiceImpl piWikService;


    @RequestMapping(value = "/getPiwikSiteForRepo/{repositoryId}" , method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public PiwikInfo getPiwikSiteForRepo(@PathVariable("repositoryId") String repositoryId) {
        return piWikService.getPiwikSiteForRepo(repositoryId);
    }

    @RequestMapping(value = "/savePiwikInfo" , method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
    @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or (hasRole('ROLE_USER') " +
            "and #piwikInfo.requestorEmail == authentication.userInfo.email)")
    public PiwikInfo savePiwikInfo(@RequestBody PiwikInfo piwikInfo) {
        return piWikService.savePiwikInfo(piwikInfo);
    }

    @RequestMapping(value = "/getPiwikSitesForRepos" , method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
    List<PiwikInfo> getPiwikSitesForRepos(){
        return piWikService.getPiwikSitesForRepos();
    }

    @RequestMapping(value = "/approvePiwikSite/{repositoryId}" , method = RequestMethod.GET)
    @ResponseBody
    @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN')")
    public ResponseEntity<Object> approvePiwikSite(@PathVariable("repositoryId") String repositoryId) {
        return piWikService.approvePiwikSite(repositoryId);
    }

    @RequestMapping(value = "/getOpenaireId/{repositoryId}" , method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    String getOpenaireId(String repositoryid){
        return piWikService.getOpenaireId(repositoryid);
    }

    @RequestMapping(value = "/markPiwikSiteAsValidated/{repositoryId}" , method = RequestMethod.POST,
            consumes = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN')")
    public ResponseEntity<Object> markPiwikSiteAsValidated(@PathVariable("repositoryId") String repositoryId) throws RepositoryServiceException {
        return piWikService.markPiwikSiteAsValidated(repositoryId);
    }

    @RequestMapping(value = "/enableMetricsForRepository", method = RequestMethod.POST,
            consumes = MediaType.APPLICATION_JSON_VALUE)
    @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or (hasRole('ROLE_USER') and #piwikInfo.requestorEmail == authentication.userInfo.email)")
    public PiwikInfo enableMetricsForRepository(@RequestParam("officialName") String officialName,
                                                @RequestParam("repoWebsite") String repoWebsite,
                                                @RequestBody PiwikInfo piwikInfo) throws RepositoryServiceException {
        return piWikService.enableMetricsForRepository(officialName, repoWebsite, piwikInfo);
    }


}
