<?php

include_once "vendor/autoload.php";

use Kinikit\Core\Util\SerialisableArrayUtils;
use Kinikit\Core\Util\Serialisation\JSON\ObjectToJSONConverter;
use Netistrar\ClientAPI\APIProvider;
use Netistrar\ClientAPI\Objects\Domain\Descriptor\DomainNameAvailabilityDescriptor;
use Netistrar\ClientAPI\Objects\Domain\Descriptor\DomainNameCreateDescriptor;
use Netistrar\ClientAPI\Objects\Domain\Descriptor\DomainNameTransferDescriptor;
use Netistrar\ClientAPI\Objects\Domain\Descriptor\DomainNameUpdateDescriptor;
use Netistrar\ClientAPI\Objects\Domain\DomainNameContact;
use Netistrar\ClientAPI\Objects\Domain\DomainNameGlueRecord;

$endpoint = "API_ENDPOINT_URL";
$apiKey = 'YOURAPIKEY';       // INSERT YOUR consumer key here
$apiSecret = 'YOURAPISECRET';    // INSERT YOUR consumer secret here

// Create new client instance
$netistrarClient = new APIProvider($endpoint, $apiKey, $apiSecret);

echo "\nCalling ping method.....";
echo $netistrarClient->utility()->ping();

echo "\n\nLooking up account balance......";
$accountBalance = $netistrarClient->account()->balance();
echo $accountBalance;

echo "\n\nCheck hinted domain availability for set of TLDs (COM,UK,WALES)........";
$availability = $netistrarClient->domains()->hintedAvailability(new DomainNameAvailabilityDescriptor("mushroom", "GBP", array("com", "uk", "wales"), true));
$tldResults = $availability->getTldResults();
echo "\n.COM: " . $tldResults["com"]->getAvailability();
echo "\n.UK: " . $tldResults["uk"]->getAvailability();
echo "\n.WALES: " . $tldResults["wales"]->getAvailability();

echo "\nSuggestions: " . join(", ", SerialisableArrayUtils::getMemberValueArrayForObjects("domainName", $availability->getSuggestions()));

echo "\n\nCheck real time availability for single TLD........";
$availability = $netistrarClient->domains()->liveAvailability("mushroom.com");
echo "\nmushroom.com: " . $availability->getAvailability();

echo "\n\nValidating a blank domain name........";
$validationErrors = $netistrarClient->domains()->validate(new DomainNameCreateDescriptor(array("mark@test.uk"), 11, new DomainNameContact(), array("badns")));
echo "Returned following Validation Errors:\n";
echo join("\n", array_keys($validationErrors["mark@test.uk"]));


date_default_timezone_set("Europe/London");
$newDomain = "test-api-domain-" . date("U") . ".rodeo";
echo "\n\nCreating a new RODEO domain name ($newDomain).........";
$ownerContact = new DomainNameContact("Joe Bloggs", "joe@bloggs.com", "3 Some Street", "Somewhere", "Sometown", "Someshire", "SM11 1SM", "GB");
$ownerContact->setAdditionalData(array("nominetRegistrantType" => "IND"));
$transaction = $netistrarClient->domains()->create(new DomainNameCreateDescriptor(array($newDomain), 1, $ownerContact, array("ns1.test.com", "ns2.test.com"), $ownerContact, $ownerContact, $ownerContact));
echo $transaction->getTransactionStatus();

echo "\n\nGet domain........";
$domains = $netistrarClient->domains()->getMultiple(array($newDomain));
$jsonConverter = new ObjectToJSONConverter();
echo "Returned:\n\n" . $jsonConverter->convert($domains[$newDomain], true);


echo "\n\nUpdating owner contact and nameservers.......";
$newOwnerContact = new DomainNameContact("Andrew Smith", "smith@smith.com", "5 New Street", "Newwhere", "Newtown", "Newshire", "NE11 1SS", "GB");
$newOwnerContact->setAdditionalData(array("nominetRegistrantType" => "LTD", "nominetCompanyNumber" => "54354676843"));
$transaction = $netistrarClient->domains()->update(new DomainNameUpdateDescriptor(array($newDomain), $newOwnerContact, null, null, null, array("ns1.newhost.com", "ns2.newhost.com", "ns3.newhost.com")));
echo $transaction->getTransactionStatus();


echo "\n\nConfirm owner contact status after owner change........";
$domain = $netistrarClient->domains()->get($newDomain);
echo $domain->getOwnerContact()->getStatus();

echo "\n\nCancel the owner contact changes.......";
$netistrarClient->domains()->ownerChangeCancel(array($newDomain));
echo "DONE";


echo "\n\nConfirm owner contact status after cancel........";
$domain = $netistrarClient->domains()->get($newDomain);
echo $domain->getOwnerContact()->getStatus();


echo "\n\nSetting some glue records.......";
$transaction = $netistrarClient->domains()->glueRecordsSet($newDomain, array(new DomainNameGlueRecord("ns1", "88.32.44.55"), new DomainNameGlueRecord("ns2", null, "00:0a:27:02:00:6b:b0:0e")));
echo $transaction->getTransactionStatus();

echo "\n\nRemove a glue record.......";
$transaction = $netistrarClient->domains()->glueRecordsRemove($newDomain, array("ns2"));
echo $transaction->getTransactionStatus();

echo "\n\nListing glue records......";
$glueRecords = $netistrarClient->domains()->glueRecordsList($newDomain);
echo "\n" . sizeof($glueRecords) . " Glue Records Returned - " . $glueRecords[0]->getSubDomainPrefix() . ": " . $glueRecords[0]->getIpv4Address();

echo "\n\nRenewing domain.......";
$transaction = $netistrarClient->domains()->renew($newDomain, 2);
echo $transaction->getTransactionStatus();

echo "\n\nList domains ordered by registration date descending........";
$domains = $netistrarClient->domains()->list("test-api-domain", 10, 1, "registeredDate", "DESC");
echo $domains->getNumberOfDomainsReturned() . " domains returned";
echo "\nFirst domain returned = " . $domains->getDomainNameSummaries()[0]->getDomainName();

echo "\n\nCreate test domain for transfer in at another Registrar......";
$testDomains = $netistrarClient->test()->createPullTransferRodeoDomains(1);
$testDomain = $testDomains[0][0];
$testAuthCode = $testDomains[0][1];
echo $testDomain . " with Auth Code: " . $testAuthCode;

echo "\n\nCreate transfer in......";
$transaction = $netistrarClient->domains()->transferCreate(new DomainNameTransferDescriptor(array($testDomain . "," . $testAuthCode), $ownerContact, $ownerContact, $ownerContact, $ownerContact));
echo $transaction->getTransactionStatus();

echo "\n\nApprove the domain transfer at the other Registrar...";
$netistrarClient->test()->approveIncomingTransferOtherRegistrar(array($testDomain));
echo "DONE";

echo "\n\nCheck the status within our account for the domain.....";
$domainName = $netistrarClient->domains()->get($testDomain);
echo $domainName->getStatus();

echo "\n\n";
