#!/usr/bin/env perl

use strict;
use warnings;

use OpenStack::MetaAPI ();

use Test2::Bundle::Extended;
use Test2::Tools::Explain;
use Test2::Plugin::NoWarnings;

use FindBin;
use lib "$FindBin::Bin/lib";

use Test::OpenStack::MetaAPI qw{:all};
use Test::OpenStack::MetaAPI::Auth qw{:all};

use JSON;

mock_lwp_useragent();

$Test::OpenStack::MetaAPI::UA_DISPLAY_OUTPUT = 1;

my $api = get_api_object(use_env => 0);

ok $api, "got one api object" or die;

{
    note "Testing servers";

    mock_get_request(
        'http://127.0.0.1:8774/v2.1/servers',
        application_json(json_for_servers()),
    );

    is [$api->servers()],
      [
        {   'id'    => '595bdd3d10d95bb1a570603015bceeee',
            'links' => [
                {   'href' =>
                      'http://127.0.0.1:8774/v2.1/servers/595bdd3d10d95bb1a570603015bceeee',
                    'rel' => 'self'
                },
                {   'href' =>
                      'http://127.0.0.1:8774/servers/595bdd3d10d95bb1a570603015bceeee',
                    'rel' => 'bookmark'
                }
            ],
            'name' => 'server one'
        },
        {   'id'    => '433bef2eda384218df1f3fe032d3c6cc',
            'links' => [
                {   'href' =>
                      'http://127.0.0.1:8774/v2.1/servers/433bef2eda384218df1f3fe032d3c6cc',
                    'rel' => 'self'
                },
                {   'href' =>
                      'http://127.0.0.1:8774/servers/433bef2eda384218df1f3fe032d3c6cc',
                    'rel' => 'bookmark'
                }
            ],
            'name' => 'server two'
        },
        {   'id'    => '8b6da0864b308971b13d03d6ccd348f5',
            'links' => [
                {   'href' =>
                      'http://127.0.0.1:8774/v2.1/servers/8b6da0864b308971b13d03d6ccd348f5',
                    'rel' => 'self'
                },
                {   'href' =>
                      'http://127.0.0.1:8774/servers/8b6da0864b308971b13d03d6ccd348f5',
                    'rel' => 'bookmark'
                }
            ],
            'name' => 'server three'
        }
      ],
      "got three servers returned";

    is $api->servers(name => 'server two'),
      { 'id'    => '433bef2eda384218df1f3fe032d3c6cc',
        'links' => [
            {   'href' =>
                  'http://127.0.0.1:8774/v2.1/servers/433bef2eda384218df1f3fe032d3c6cc',
                'rel' => 'self'
            },
            {   'href' =>
                  'http://127.0.0.1:8774/servers/433bef2eda384218df1f3fe032d3c6cc',
                'rel' => 'bookmark'
            }
        ],
        'name' => 'server two'
      },
      "api->servers( name => 'server two' )";

    mock_get_request(
        'http://127.0.0.1:8774/v2.1/servers/33748c23-38dd-4f70-b774-522fc69e7b67',
        application_json(json_for_server()),
    );

    my $output = $api->server_from_uid('33748c23-38dd-4f70-b774-522fc69e7b67');
    is last_http_request(),
      "GET http://127.0.0.1:8774/v2.1/servers/33748c23-38dd-4f70-b774-522fc69e7b67",
      "last_http_request";

    is $output, JSON::decode_json(json_for_server())->{server},
      "get a server from uid";

}

done_testing;

sub json_for_server {

# https://developer.openstack.org/api-ref/compute/?expanded=show-server-details-detail
    return <<'JSON';
{
    "server": {
        "OS-EXT-AZ:availability_zone": "UNKNOWN",
        "OS-EXT-STS:power_state": 0,
        "created": "2018-12-03T21:06:18Z",
        "flavor": {
            "disk": 1,
            "ephemeral": 0,
            "extra_specs": {},
            "original_name": "m1.tiny",
            "ram": 512,
            "swap": 0,
            "vcpus": 1
        },
        "id": "33748c23-38dd-4f70-b774-522fc69e7b67",
        "image": {
            "id": "70a599e0-31e7-49b7-b260-868f441e862b",
            "links": [
                {
                    "href": "http://openstack.example.com/6f70656e737461636b20342065766572/images/70a599e0-31e7-49b7-b260-868f441e862b",
                    "rel": "bookmark"
                }
            ]
        },
        "status": "UNKNOWN",
        "tenant_id": "project",
        "user_id": "fake",
        "links": [
            {
                "href": "http://openstack.example.com/v2.1/6f70656e737461636b20342065766572/servers/33748c23-38dd-4f70-b774-522fc69e7b67",
                "rel": "self"
            },
            {
                "href": "http://openstack.example.com/6f70656e737461636b20342065766572/servers/33748c23-38dd-4f70-b774-522fc69e7b67",
                "rel": "bookmark"
            }
        ]
    }
}
JSON
}

sub json_for_servers {
    return <<'JSON';
{
   "servers" : [
      {
         "name" : "server one",
         "links" : [
            {
               "rel" : "self",
               "href" : "http://127.0.0.1:8774/v2.1/servers/595bdd3d10d95bb1a570603015bceeee"
            },
            {
               "href" : "http://127.0.0.1:8774/servers/595bdd3d10d95bb1a570603015bceeee",
               "rel" : "bookmark"
            }
         ],
         "id" : "595bdd3d10d95bb1a570603015bceeee"
      },
      {
         "name" : "server two",
         "id" : "433bef2eda384218df1f3fe032d3c6cc",
         "links" : [
            {
               "rel" : "self",
               "href" : "http://127.0.0.1:8774/v2.1/servers/433bef2eda384218df1f3fe032d3c6cc"
            },
            {
               "rel" : "bookmark",
               "href" : "http://127.0.0.1:8774/servers/433bef2eda384218df1f3fe032d3c6cc"
            }
         ]
      },
      {
         "id" : "8b6da0864b308971b13d03d6ccd348f5",
         "links" : [
            {
               "rel" : "self",
               "href" : "http://127.0.0.1:8774/v2.1/servers/8b6da0864b308971b13d03d6ccd348f5"
            },
            {
               "rel" : "bookmark",
               "href" : "http://127.0.0.1:8774/servers/8b6da0864b308971b13d03d6ccd348f5"
            }
         ],
         "name" : "server three"
      }
   ]
}
JSON
}

__END__