import { Injectable } from "@nestjs/common";
import { StartJobDto } from "./dto/start-job.dto";
import { UploadFileAsBatchDto } from "./dto/upload-file-as-batch.dto";
import axios from "axios";
import SarvamClient from "./lib/sarvam-client";
import { DataSource } from "typeorm";

const JOB_INIT_ENDPOINT =
  "https://api.sarvam.ai/speech-to-text-translate/job/init";
const JOB_ENDPOINT = "https://api.sarvam.ai/speech-to-text-translate/job";
const API_KEY = "7cb54b7a-4b41-4e59-a117-56cd8e5feb64";

@Injectable()
export class SttTranslateSarvamService {
  constructor(
    private readonly connection: DataSource
  ) { }
  async initializeJob() {
    try {
      const response = await axios.post(JOB_INIT_ENDPOINT, null, {
        headers: { "api-subscription-key": API_KEY },
      });

      return response.data;
    } catch (error) {
      throw new Error(
        `Job initialization failed, please check ${JOB_INIT_ENDPOINT}`
      );
    }
  }

  async checkJobStatus(jobId: string) {
    try {
      const response = await axios.get(`${JOB_ENDPOINT}/${jobId}/status`, {
        headers: { "api-subscription-key": API_KEY },
      });

      return response.data;
    } catch (error) {
      throw new Error(
        `Failed to check job status, please check ${JOB_ENDPOINT}`
      );
    }
  }

  async startJob(jobInfo: StartJobDto) {
    const reqBody = {
      job_id: jobInfo,
      job_parameters: {},
    };

    try {
      const response = await axios.post(JOB_ENDPOINT, reqBody, {
        headers: {
          "api-subscription-key": API_KEY,
          "content-type": "application/json",
        },
      });

      return response.data;
    } catch (error) {
      throw new Error(
        `Failed to check job status, please check ${JOB_ENDPOINT}`
      );
    }
  }

  async uploadFileAsBatch(
    uploadFileAsBatchDto: UploadFileAsBatchDto,
    files: Express.Multer.File[]
  ) {
    console.log(uploadFileAsBatchDto, "uploadFileAsBatchDto");

    try {
      if (!uploadFileAsBatchDto.opd_id && !uploadFileAsBatchDto.hospital_id) {
        return {
          message: "Please provide opd_id and hospital_id",
          status: "Failed",
        };
      }
      const getDetails = await this.initializeJob();
      const sarvamClient = new SarvamClient(await getDetails.input_storage_path);
      await sarvamClient.uploadFiles(files);
      await this.startJob(await getDetails.job_id);
      uploadFileAsBatchDto.job_id = await getDetails.job_id;
      console.log(uploadFileAsBatchDto, "uploadFileAsBatchDto");

      const [getBaseURL] = await this.connection.query(`select op_hub_base_url from hospitals where plenome_id = ?`, [uploadFileAsBatchDto.hospital_id])
      await axios.post(`${getBaseURL.op_hub_base_url}/sarvam-job-opd-id-mapping`, uploadFileAsBatchDto)
      return {
        message: "Files uploaded successfully",
        job_id: getDetails.job_id
      };
    } catch (error) {

      throw new Error(`Error while uploading the files.`);
    }
  }


  async downloadFileAsZip(blobDownloadUrl: string, hospital_id: string) {
    try {
      const [getBaseURL] = await this.connection.query(`select op_hub_base_url from hospitals where plenome_id = ?`, [hospital_id])
      const url = await axios.get(`${getBaseURL.op_hub_base_url}/sarvam-job-opd-id-mapping?opd_id=${blobDownloadUrl}`)
      let jobId = url.data.data[0].sarvam_job_id
      let status = await this.checkJobStatus(jobId)
      if (status.job_state.toLocaleLowerCase() !== "completed") {
        return {
          message: "Job is not completed yet",
          status: "Failed",
          currentStatus: status.job_state,
        }
      }
      let encoded = btoa(status.output_storage_path);
      encoded = atob(encoded);
      const sarvamClient = new SarvamClient(encoded);
      let asdf = await sarvamClient.readZipContents()
      return asdf;
    } catch (error) {
      throw new Error(`Error while downloading the files.`);
    }
  }
}
