/*
 *
 * 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.airavata.datalake.orchestrator.api.controller.remote;

import org.apache.airavata.datalake.orchestrator.api.model.remote.SFTPCredential;
import org.apache.airavata.datalake.orchestrator.api.model.remote.SFTPRemote;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(path = "/remotes/sftp")
public class SFTPController {

    @GetMapping(value = "/{remoteId}", produces = "application/json")
    public SFTPRemote fetchSFTPRemote(@PathVariable(name = "remoteId") String remoteId) {
        return new SFTPRemote()
            .setHost("localhost")
            .setPort(22)
            .setCredential(
                    new SFTPCredential()
                        .setAuthMethod(SFTPCredential.AuthMethod.SSH_KEY)
                        .setPrivateKey("")
                        .setPublicKey(""));
    }

    @PostMapping(value = "")
    public String createSFTPRemote(@RequestBody SFTPRemote sftpRemote) {
        return "Remote id";
    }

    @PutMapping(value = "/{remoteId}")
    public String updateSFTPRemote(@RequestBody SFTPRemote sftpRemote,
                                   @PathVariable(name = "remoteId") String remoteId) {
        return "Remote id";
    }

    @DeleteMapping(value = "/{remoteId}")
    public String removeSFTPRemote(@PathVariable(name = "remoteId") String remoteId) {
        return "Deleted";
    }
}
