package PVE::APIClient::Commands::remote;

use strict;
use warnings;

use PVE::JSONSchema qw(register_standard_option get_standard_option);
use PVE::APIClient::Config;

use PVE::CLIHandler;

use PVE::APIClient::LWP;
use PVE::PTY ();

use base qw(PVE::CLIHandler);

my $complete_remote_name = sub {

    my $config = PVE::APIClient::Config->new();
    return $config->remote_names;
};

register_standard_option('pveclient-remote-name', {
    description => "The name of the remote.",
    type => 'string',
    pattern => qr(\w+),
    completion => $complete_remote_name,
});

sub read_password {
   return PVE::PTY::read_password("Remote password: ")
}

__PACKAGE__->register_method ({
    name => 'add',
    path => 'add',
    method => 'POST',
    description => "Add a remote to your config file.",
    parameters => {
	additionalProperties => 0,
	properties => {
	    name => get_standard_option('pveclient-remote-name', { completion => sub {} }),
	    host => {
		description => "The host.",
		type => 'string',
		format => 'address',
	    },
	    username => {
		description => "The username.",
		type => 'string',
	    },
	    password => {
		description => "The users password",
		type => 'string',
	    },
	    port => {
		description => "The port",
		type => 'integer',
		optional => 1,
		default => 8006,
	    }
	},
    },
    returns => { type => 'null'},
    code => sub {
	my ($param) = @_;

	my $config = PVE::APIClient::Config->new();
	my $known_remotes = $config->remotes;

	if (exists($known_remotes->{$param->{name}})) {
	    die "Remote \"$param->{name}\" exists, remove it first\n";
	}

	my $last_fp = 0;
	my $api = PVE::APIClient::LWP->new(
	    username                => $param->{username},
	    password                => $param->{password},
	    host                    => $param->{host},
	    port                    => $param->{port} // 8006,
	    manual_verification     => 1,
	    register_fingerprint_cb => sub {
		my $fp = shift @_;
		$last_fp = $fp;
	    },
	);
	$api->login();

	$config->add_remote($param->{name}, $param->{host}, $param->{port} // 8006, 
			    $last_fp, $param->{username}, $param->{password});
	$config->save;

	return undef;
    }});

__PACKAGE__->register_method ({
    name => 'remove',
    path => 'remove',
    method => 'DELETE',
    description => "Removes a remote from your config file.",
    parameters => {
	additionalProperties => 0,
	properties => {
	    name => get_standard_option('pveclient-remote-name'),
	},
    },
    returns => { type => 'null'},
    code => sub {
	my ($param) = @_;

	die "implement me";

    }});

our $cmddef = {
    add => [ __PACKAGE__, 'add', ['name', 'host', 'username']],
    remove => [ __PACKAGE__, 'remove', ['name']],
};

1;
