import type { IDAgent } from '../agent/index.js';

export class Services {
  private agent: IDAgent;
  private connectedDid: string;

  constructor(options: { agent: IDAgent, connectedDid: string }) {
    this.agent = options.agent;
    this.connectedDid = options.connectedDid;
  }

  async get(payload) {
    try {
      const headers = new Headers();
      for (let header of payload.headers) {
        headers.append(header.name, header.value);
      }
      const response = await fetch(payload.uri, {
        method  : 'GET',
        mode    : 'cors',
        cache   : 'no-cache',
        headers : headers,
      });
      if (!response.ok) {
        return { status: response.status };
      }
      const json = await response.json();
      return json;

    } catch (e) {
      return { status: 400, error: e };
    }
  }

  async post(payload) {
    try {

      const headers = new Headers();
      for (let header of payload.headers) {
        headers.append(header.name, header.value);
      }

      const response = await fetch(payload.uri, {
        method  : 'POST',
        mode    : 'cors',
        cache   : 'no-cache',
        headers : headers,
        body    : JSON.stringify(payload.body),
      });

      if (!response.ok) {
        return { status: response.status };
      }
      const json = await response.json();
      return json;

    } catch (e) {
      return { status: 400, error: e };
    }

  }

  async put(payload) {
    try {

      const headers = new Headers();
      for (let header of payload.headers) {
        headers.append(header.name, header.value);
      }

      const response = await fetch(payload.uri, {
        method  : 'PUT',
        mode    : 'cors',
        cache   : 'no-cache',
        headers : headers,
        body    : JSON.stringify(payload.body),
      });

      if (!response.ok) {
        return { status: response.status };
      }
      const json = await response.json();
      return json;

    } catch (e) {
      return { status: 400 };
    }

  }

  async proxy(payload) {

    try {
      const headers = new Headers();
      for (let header of payload.headers) {
        headers.append(header.name, header.value);
      }

      const proxyRequest: any = {
        method  : payload.method,
        mode    : 'cors',
        cache   : 'no-cache',
        headers : headers,
      };

      payload?.body ? proxyRequest.body = JSON.stringify(payload) : undefined;

      const response = await fetch(payload.proxy, proxyRequest);

      if (!response.ok) {
        return { status: response.status, payload };
      }
      const json = await response.json();
      return json;

    } catch (e) {
      return { status: 400, error: e };
    }

  }

}