import { inject, injectable } from "inversify";
import { AppLogger } from "../app/app.logger";
import HttpClient from "../httpclient/http.service";
import * as cheerio from "cheerio";

@injectable()
export class XInputService {
  constructor(
    @inject(AppLogger) private logger: AppLogger,
    @inject(HttpClient) private httpClient: HttpClient
  ) {}

  async getXInputForm(url: string) {
    try {
      const xInputRes = await this.httpClient.get<any>(url);

      const xinputHTML = await this.sanatizeXInputHtml(xInputRes?.textHtml);

      return xinputHTML;
    } catch (e) {
      this.logger.error("Error in fetching xinput form", e);
      return {};
    }
  }

  async sanatizeXInputHtml(html: string) {
    const $ = cheerio.load(html);
    const $formAction = $("form").attr("action");
    const $formMethod = $("form").attr("method");
    $("form").attr("id", "xinputform");
    $("form").removeAttr("action");
    $("form").removeAttr("method");
    $("form").append(
      `<input type="hidden" value=${$formAction} id="action" name="action"></input>`
    );
    $("form").append(
      `<input type="hidden" value=${$formMethod} id="method" name="method"></input>`
    );
    $("input[type='submit']").attr("id", "xinputsubmitbutton");
    return $.html();
  }

  async submitXInputForm(body: any) {
    try {
      const actionUrl = body?.action;
      const method = body?.method;
      delete body.action;
      delete body.method;
      console.log("Data======>====>", {
        url: actionUrl,
        method,
        data: body
      });
      const submitFormDataResp = await this.httpClient.client({
        url: actionUrl,
        method,
        data: body
      });
      return submitFormDataResp.data;
    } catch (error: any) {
      return { message: error.message };
    }
  }
}