import { IdentityVerificationApi } from '../../api/identityVerificationApi';
import { DocumentApi } from '../../api/documentApi';
import {DocumentSigner,FormField,Rectangle,SendForSign,IdentityVerificationSettings,EmbeddedFileDetails,VerificationDataRequest,DownloadImageRequest} from '../../model';
import * as fs from 'fs';
import config from '../config';
 
describe('Document API Test Suite', () => {
    let identityVerificationApi: IdentityVerificationApi;
    let documentApi: DocumentApi;
    let createdDocumentId;
 
    beforeAll(() => {
        createdDocumentId = null;
 
        const apiKey = config.apiKey;
        const baseUrl = config.baseUrl;
 
        if (!apiKey || !baseUrl) {
        throw new Error("Environment variables 'API_KEY' or 'HOST_URL' are not set.");
        }
 
    documentApi = new DocumentApi(baseUrl);
    documentApi.setApiKey(apiKey);
    identityVerificationApi = new IdentityVerificationApi(baseUrl);
    identityVerificationApi.setApiKey(apiKey);
    });

    test('Test1:should send a document with identity verification', async () => {
        try {
        const signer = new DocumentSigner();
        signer.name = 'Test Signer';
        signer.emailAddress = 'sivaramani.sivaraj@syncfusion.com';
        signer.signerOrder = 1;
        signer.signerType = DocumentSigner.SignerTypeEnum.Signer;
        signer.authenticationType = DocumentSigner.AuthenticationTypeEnum.IdVerification;
        const formField = new FormField();
        formField.name = 'Sign';
        formField.fieldType = FormField.FieldTypeEnum.Signature;
        formField.font = FormField.FontEnum.Helvetica;
        formField.pageNumber = 1;
        formField.isRequired = true;
        const bounds = new Rectangle();
        bounds.x = 50;
        bounds.y = 50;
        bounds.width = 200;
        bounds.height = 50;
        formField.bounds = bounds;
        signer.formFields = [formField];
        signer.privateMessage = 'This is a private message for signer';
        const idVerificationSettings = new IdentityVerificationSettings();
        idVerificationSettings.type = IdentityVerificationSettings.TypeEnum.EveryAccess;
        idVerificationSettings.maximumRetryCount = 2;
        const sendDocumentRequest = new SendForSign();
        sendDocumentRequest.title = 'Document SDK API - ID Verification';
        sendDocumentRequest.files = [fs.createReadStream('tests/documents/agreement.pdf')];
        sendDocumentRequest.enablePrintAndSign = true;
        sendDocumentRequest.signers = [signer];
        sendDocumentRequest.message = 'Please verify your identity and sign this document';
        const response = await documentApi.sendDocument(sendDocumentRequest);
        expect(response.documentId).toBeDefined();
        createdDocumentId = response.documentId;
        console.log('Document sent with ID verification. Document ID:', createdDocumentId);
        } catch (error) {
        console.error('Error occurred while sending document with identity verification:', error);
        expect(error).toBeUndefined();
        }
    }, 7000000);
    test('Test2:should fail to create an embedded verification URL with invalid document ID', async () => {
    const manualVerification: EmbeddedFileDetails = {
        emailId: 'sivaramani.sivaraj@syncfusion.com',
        countryCode: '+91',
        phoneNumber: '8807799764',
        redirectUrl: 'https://www.boldsign.com',
        order: 1
        };
        try {
            const response = await identityVerificationApi.createEmbeddedVerificationUrl(createdDocumentId, manualVerification);
            fail('Expected 400 Bad Request error, but the API call succeeded.');
        } catch (error: any) {
            console.error(error);
            expect(error).toBeDefined();
        }
    }, 700000);
    test('Test3:should fail when requesting verification report with invalid or unauthorized data', async () => {
    const requestData: VerificationDataRequest = {
        emailId: 'sivaramani.sivaraj@syncfusion.com',
        countryCode: '+91',
        phoneNumber: '8807799764',
        order: 1
        };
        try {
            await identityVerificationApi.report(createdDocumentId, requestData);
            fail('Expected 403 Forbidden error, but the API call succeeded.');
        } catch (error: any) {
            expect(error).toBeDefined();
        }
    }, 700000);
    test('Test4:should fail invalid file ID in image download request', async () => {
    const imageRequest: DownloadImageRequest = {
        emailId: 'sivaramani.sivaraj@syncfusion.com',
        countryCode: '+91',
        phoneNumber: '8807799764',
        fileId: 'invalid-file-id',
        order: 1
        };
        try {
            const imageResponse = await identityVerificationApi.image(createdDocumentId, imageRequest);
            console.log('Unexpectedly received image response:', imageResponse);
            fail('Expected 403 Forbidden error, but the API call succeeded.');
        } catch (error: any) {
            expect(error).toBeDefined();
        }
    }, 700000);
})