import { Api } from './api';
import { Connection, TestRequest, ConnectionPoolType, SocketResult } from './crud.typings';
import { requestGet, requestDelete, requestPost, requestPut } from './crud.service';
import { editStatusEvent } from '@constants/env';

export class DecisionApi implements Api {
    isDec = true;

    getConnectionlist(): Promise<{data: Connection[]}> {
        return requestGet('list');
    }

    deleteConnection(connectionName: string): Promise<{data: string}> {
        return requestDelete('', {
            connectionName,
        });
    }

    addConnection(data: Connection): Promise<{data: string}> {
        const form = {
            ...data,
            connectionId: data.connectionName,
            connectionData : JSON.stringify(data.connectionData),
        };
        
        return requestPost('', form);
    }

    updateConnection(data: Connection): Promise<{data: string}> {
        const form = {
            ...data,
            connectionData : JSON.stringify(data.connectionData),
        };
        
        return requestPut('', form);
    }

    testConnection(data: Connection): Promise<TestRequest> {
        const form = {
            ...data,
            connectionId: data.connectionName,
            connectionData : JSON.stringify(data.connectionData),
        };
        
        return requestPost('test', form);
    }

    getConnectionPool(name: string): Promise<{data: ConnectionPoolType}> {
        return requestGet(`pool/info?connectionName=${name}`);
    }

    getConnectionStatus(name: string): Promise<SocketResult> {
        return this.sendEditStatusEvent(name, editStatusEvent.OPEN);
    }

    shutdownConnectionStatus(name: string): Promise<SocketResult> {
        return this.sendEditStatusEvent(name, editStatusEvent.SHUTDOWN);
    }

    private sendEditStatusEvent(name: string, type: string): Promise<SocketResult> {
        return new Promise(resolve => {
            if (Dec) {
                const re = Dec.socket.emit(editStatusEvent.SHUTDOWN, name);
                resolve(JSON.parse(re));
            }
            resolve({ data: 'success' });
        });
    }
}