/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.shardingsphere.elasticjob.lite.ui.web.controller;

import org.apache.shardingsphere.elasticjob.lite.lifecycle.domain.JobBriefInfo;
import org.apache.shardingsphere.elasticjob.lite.lifecycle.domain.ServerBriefInfo;
import org.apache.shardingsphere.elasticjob.lite.ui.service.JobAPIService;
import org.apache.shardingsphere.elasticjob.lite.ui.util.SessionRegistryCenterConfiguration;
import org.apache.shardingsphere.elasticjob.lite.ui.web.response.ResponseResult;
import org.apache.shardingsphere.elasticjob.lite.ui.web.response.ResponseResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collection;
import java.util.Collections;
import java.util.Objects;

/**
 * Server operation RESTful API.
 */
@RestController
@RequestMapping("/api/servers")
public final class ServerOperationController {
    
    private JobAPIService jobAPIService;
    
    @Autowired
    public ServerOperationController(final JobAPIService jobAPIService) {
        this.jobAPIService = jobAPIService;
    }
    
    /**
     * Get servers total count.
     * 
     * @return servers total count
     */
    @GetMapping("/count")
    public int getServersTotalCount() {
        return jobAPIService.getServerStatisticsAPI().getServersTotalCount();
    }
    
    /**
     * Get all servers brief info.
     * 
     * @return all servers brief info
     */
    @GetMapping("/getAllServersBriefInfo")
    public ResponseResult<Collection<ServerBriefInfo>> getAllServersBriefInfo() {
        Collection<ServerBriefInfo> data =  Objects.nonNull(SessionRegistryCenterConfiguration.getRegistryCenterConfiguration()) ?
                jobAPIService.getServerStatisticsAPI().getAllServersBriefInfo() : Collections.emptyList();
        return ResponseResultUtil.build(data);
    }
    
    /**
     * Disable server.
     *
     * @param serverIp server IP address
     */
    @PostMapping("/{serverIp}/disable")
    public ResponseResult<Boolean> disableServer(@PathVariable("serverIp") final String serverIp) {
        jobAPIService.getJobOperatorAPI().disable(null, serverIp);
        return ResponseResultUtil.build(Boolean.TRUE);
    }
    
    /**
     * Enable server.
     *
     * @param serverIp server IP address
     */
    @PostMapping("/{serverIp}/enable")
    public ResponseResult<Boolean> enableServer(@PathVariable("serverIp") final String serverIp) {
        jobAPIService.getJobOperatorAPI().enable(null, serverIp);
        return ResponseResultUtil.build(Boolean.TRUE);
    }
    
    /**
     * Shutdown server.
     *
     * @param serverIp server IP address
     */
    @PostMapping("/{serverIp}/shutdown")
    public ResponseResult<Boolean> shutdownServer(@PathVariable("serverIp") final String serverIp) {
        jobAPIService.getJobOperatorAPI().shutdown(null, serverIp);
        return ResponseResultUtil.build(Boolean.TRUE);
    }
    
    /**
     * Remove server.
     *
     * @param serverIp server IP address
     */
    @DeleteMapping("/{serverIp:.+}")
    public ResponseResult<Boolean> removeServer(@PathVariable("serverIp") final String serverIp) {
        jobAPIService.getJobOperatorAPI().remove(null, serverIp);
        return ResponseResultUtil.build(Boolean.TRUE);
    }
    
    /**
     * Get jobs.
     *
     * @param serverIp server IP address
     * @return Job brief info
     */
    @GetMapping(value = "/{serverIp}/jobs")
    public ResponseResult<Collection<JobBriefInfo>> getJobs(@PathVariable("serverIp") final String serverIp) {
        Collection<JobBriefInfo> data = jobAPIService.getJobStatisticsAPI().getJobsBriefInfo(serverIp);
        return ResponseResultUtil.build(data);
    }
    
    /**
     * Disable server job.
     * 
     * @param serverIp server IP address
     * @param jobName job name
     */
    @PostMapping(value = "/{serverIp}/jobs/{jobName}/disable")
    public ResponseResult<Boolean> disableServerJob(@PathVariable("serverIp") final String serverIp, @PathVariable("jobName") final String jobName) {
        jobAPIService.getJobOperatorAPI().disable(jobName, serverIp);
        return ResponseResultUtil.build(Boolean.TRUE);
    }
    
    /**
     * Enable server job.
     *
     * @param serverIp server IP address
     * @param jobName job name
     */
    @PostMapping("/{serverIp}/jobs/{jobName}/enable")
    public ResponseResult<Boolean> enableServerJob(@PathVariable("serverIp") final String serverIp, @PathVariable("jobName") final String jobName) {
        jobAPIService.getJobOperatorAPI().enable(jobName, serverIp);
        return ResponseResultUtil.build(Boolean.TRUE);
    }
    
    /**
     * Shutdown server job.
     *
     * @param serverIp server IP address
     * @param jobName job name
     */
    @PostMapping("/{serverIp}/jobs/{jobName}/shutdown")
    public ResponseResult<Boolean> shutdownServerJob(@PathVariable("serverIp") final String serverIp, @PathVariable("jobName") final String jobName) {
        jobAPIService.getJobOperatorAPI().shutdown(jobName, serverIp);
        return ResponseResultUtil.build(Boolean.TRUE);
    }
    
    /**
     * Remove server job.
     *
     * @param serverIp server IP address
     * @param jobName job name
     */
    @DeleteMapping("/{serverIp}/jobs/{jobName:.+}")
    public ResponseResult<Boolean> removeServerJob(@PathVariable("serverIp") final String serverIp, @PathVariable("jobName") final String jobName) {
        jobAPIService.getJobOperatorAPI().remove(jobName, serverIp);
        return ResponseResultUtil.build(Boolean.TRUE);
    }
}
