package com.qunar.cm.ic.controller;

import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.qunar.cm.ic.dto.ListenerFetchResult;
import com.qunar.cm.ic.dto.MessageResponse;
import com.qunar.cm.ic.service.ListenerService;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * Created by yu.qi on 2018/08/29.
 */
@Controller
@Validated
public class ListenerController extends AbstractController {

    @Resource
    private ListenerService listenerService;

    @GetMapping("/api/v2/event/listener/{token}")
    @ResponseBody
    public ListenerFetchResult getEvents(
            @NotBlank
            @PathVariable String token,
            @RequestParam(required = false) String type,
            @NonNull
            @RequestParam(required = false, defaultValue = "") List<String> types,
            @Max(100)
            @Min(1)
            @NotNull
            @RequestParam(required = false, defaultValue = "100") int maxResults,
            @RequestParam(required = false, defaultValue = "false") boolean longPoll) {
        List<String> targetTypes = Lists.newArrayList(types);
        if(!Strings.isNullOrEmpty(type)) {
            targetTypes.add(type);
        }
        return listenerService.consumeEvents(token, targetTypes, maxResults, longPoll, getClientIp());
    }

    @PostMapping("/api/v2/event/listener/{token}/{code}")
    @ResponseBody
    public MessageResponse acknowledge(
            @NotBlank
            @PathVariable String token,
            @NotBlank
            @PathVariable String code) {
        listenerService.acknowledge(token, code, getClientIp());
        return new MessageResponse("success");
    }
}