/// <reference types="Cypress" />

describe('Full Certificate Provisions', () => {
	let token;
	let caID;
	let dnsID;

	before(() => {
		cy.getToken().then((tok) => {
			token = tok;

			cy.task('backendApiPost', {
				token: token,
				path:  '/api/certificate-authorities',
				data:  {
					name:                  'Test CA',
					acmesh_server:         'https://ca.internal/acme/acme/directory',
					ca_bundle:             '/etc/ssl/certs/NginxProxyManager.crt',
					max_domains:           5,
					is_wildcard_supported: true
				}
			}).then((data) => {
				// cy.validateSwaggerSchema('post', 201, '/certificate-authorities', data);
				expect(data.result).to.have.property('id');
				expect(data.result.id).to.be.greaterThan(0);
				caID = data.result.id;
			});

			cy.task('backendApiPost', {
				token: token,
				path:  '/api/dns-providers',
				data:  {
					acmesh_name:  'dns_pdns',
					name:         'PowerDNS - example.com',
					dns_sleep:    5,
					meta:         {
						url:       'http://ns1.pdns:8081',
						server_id: 'localhost',
						token:     'npm',
						ttl:       '5'
					}
				}
			}).then((data) => {
				cy.validateSwaggerSchema('post', 201, '/dns-providers', data);
				expect(data.result).to.have.property('id');
				expect(data.result.id).to.be.greaterThan(0);
				dnsID = data.result.id;
			});
		});
	});

	it('Should be able to create new http certificate', function() {
		cy.task('backendApiPost', {
			token: token,
			path:  '/api/certificates',
			data:  {
				type:                     'http',
				certificate_authority_id: caID,
				name:                     'website1.example.com',
				domain_names:             [
					'website1.example.com'
				]
			}
		}).then((data) => {
			cy.validateSwaggerSchema('post', 201, '/certificates', data);
			expect(data.result).to.have.property('id');
			expect(data.result.id).to.be.greaterThan(0);
			expect(data.result.user_id).to.be.greaterThan(0);
			cy.waitForCertificateStatus(token, data.result.id, 'provided');
		});
	});

	it('Should be able to create new dns certificate', function() {
		cy.task('backendApiPost', {
			token: token,
			path:  '/api/certificates',
			data:  {
				type:                     'dns',
				certificate_authority_id: caID,
				dns_provider_id:          dnsID,
				name:                     'dns: website2.example.com',
				domain_names:             [
					'website2.example.com'
				]
			}
		}).then((data) => {
			cy.validateSwaggerSchema('post', 201, '/certificates', data);
			expect(data.result).to.have.property('id');
			expect(data.result.id).to.be.greaterThan(0);
			expect(data.result.user_id).to.be.greaterThan(0);
			cy.waitForCertificateStatus(token, data.result.id, 'provided');
		});
	});

});