import AmbientConfig from "../config/AmbientConfig";
import { NoteTypeConfig } from "../config/NoteTypeConfig";
import { Guard } from "../utils/Guard";
import { BaseAPI } from "./BaseAPI";

export class AmbientRestAPI extends BaseAPI {
  private _baseUrl: string;
  constructor(private _config: AmbientConfig) {
    super();
    this._baseUrl = `https://${_config.server}/ambient/v1`;
  }

  private getURL(path: string): string {
    return `${this._baseUrl}${path}`;
  }

  async GetNoteParams(): Promise<any> {
    const url = this.getURL("/note-params");
    const requestData = {
      SubscriptionCode: this._config.subscriptionCode,
      AccessKey: this._config.accessKey,
      UserTag: this._config.userTag,
    };
    return await this.makePostRequest(url, requestData);
  }

  async ListJobs(_pageSize: number, _pageId?: string): Promise<any> {
    Guard.Against.NullOrEmpty(_pageSize, "Page Size");
    const url = this.getURL("/list-jobs");
    const requestData = {
      SubscriptionCode: this._config.subscriptionCode,
      AccessKey: this._config.accessKey,
      UserTag: this._config.userTag,
      PageSize: _pageSize,
      PageID: _pageId,
    };
    return await this.makePostRequest(url, requestData);
  }

  async FetchJob(_jobId: string): Promise<any> {
    Guard.Against.NullOrEmpty(_jobId, "Job Id");
    const url = this.getURL("/fetch-job");
    const requestData = {
      SubscriptionCode: this._config.subscriptionCode,
      AccessKey: this._config.accessKey,
      UserTag: this._config.userTag,
      JobID: _jobId,
    };
    return await this.makePostRequest(url, requestData);
  }

  async SendFinalNote(_jobId: string, _noteDate: string): Promise<any> {
    Guard.Against.NullOrEmpty(_jobId, "Job Id");
    Guard.Against.NullOrEmpty(_noteDate, "Note Data");
    const url = this.getURL("/send-final-note");
    const requestData = {
      SubscriptionCode: this._config.subscriptionCode,
      AccessKey: this._config.accessKey,
      UserTag: this._config.userTag,
      JobID: _jobId,
      SoapData: _noteDate,
    };
    return await this.makePostRequest(url, requestData);
  }

  async DeleteNotes(_jobIds: string[]): Promise<any> {
    Guard.Against.NullOrEmpty(_jobIds, "Job Id");
    const url = this.getURL("/delete-job");
    const requestData = {
      SubscriptionCode: this._config.subscriptionCode,
      AccessKey: this._config.accessKey,
      UserTag: this._config.userTag,
      JobIDs: _jobIds,
    };
    return await this.makePostRequest(url, requestData);
  }

  async RenameNoteTitle(_jobId: string, _newJobName: string): Promise<any> {
    Guard.Against.NullOrEmpty(_jobId, "Job Id");
    Guard.Against.NullOrEmpty(_newJobName, "Job Name");
    const url = this.getURL("/rename-job");
    const requestData = {
      SubscriptionCode: this._config.subscriptionCode,
      AccessKey: this._config.accessKey,
      UserTag: this._config.userTag,
      JobID: _jobId,
      JobName: _newJobName,
    };
    return await this.makePostRequest(url, requestData);
  }

  async DownloadNotePDF(_jobId: string, _noteType: NoteTypeConfig, _specialityId: number, _language?: string, _personnelInfo?: string, _regenerateNote?: boolean): Promise<any> {
    Guard.Against.NullOrEmpty(_jobId, "Job Id");
    const url = this.getURL("/download-pdf");
    var personalInfo = _personnelInfo
    if (!personalInfo || personalInfo == '') {
      personalInfo = '{"PatientName":"","PatientID":"","Age":"","Gender":"","ReceivingDoctor":"","DoctorName":"","DoctorDesignation":"","DoctorEmail":""}'
    }
    const requestData = {
      SubscriptionCode: this._config.subscriptionCode,
      AccessKey: this._config.accessKey,
      UserTag: this._config.userTag,
      JobID: _jobId,
      NoteType: _noteType as number,
      Language: _language ?? 'English',
      SpecialityID: _specialityId,
      Regenerate: _regenerateNote ?? false,
      PersonnelInfo: personalInfo
    };
    return await this.makePostRequest(url, requestData);
  }

  async EndJob(_jobId: string): Promise<any> {
    Guard.Against.NullOrEmpty(_jobId, "Job Id");
    const url = this.getURL("/end-job");
    const requestData = {
      SubscriptionCode: this._config.subscriptionCode,
      AccessKey: this._config.accessKey,
      UserTag: this._config.userTag,
      JobID: _jobId,
    };
    return await this.makePostRequest(url, requestData);
  }

  async UpdatePatientContext(_jobId: string, _context: string, _replace: boolean) {
    Guard.Against.NullOrEmpty(_jobId, "Job Id");
    Guard.Against.NullOrEmpty(_context, "Patient Context");
    const url = this.getURL('/patient-context')
    const requestData = {
      SubscriptionCode: this._config.subscriptionCode,
      AccessKey: this._config.accessKey,
      UserTag: this._config.userTag,
      JobID: _jobId,
      NewContext: _context,
      Replace: _replace
    }
    return await this.makePostRequest(url, requestData);
  }

  async GenerateSuggestions(
    _jobId: string,
    _regenerate: boolean,
    _note?: string,
    _context?: string,
    _codes?: string,
    version?: number
  ) {
    Guard.Against.NullOrEmpty(_jobId, "Job Id");
    var url = this.getURL('/cdi');

    if (version && version === 2) {
      url = this.getURL('/cdi').replace("/v1", "/v2");
    }
    const requestData = {
      SubscriptionCode: this._config.subscriptionCode,
      AccessKey: this._config.accessKey,
      UserTag: this._config.userTag,
      JobID: _jobId,
      Regenerate: _regenerate,
      SoapData: _note,
      PatientContext: _context,
      Codes: _codes
    };
    return await this.makePostRequest(url, requestData);
  }


  async ModifyGeneratedNote(_jobId: string, _noteType: NoteTypeConfig, _modifiedNote?: string) {
    Guard.Against.NullOrEmpty(_jobId, "Job Id");
    const url = this.getURL('/modify-note');
    const requestData = {
      SubscriptionCode: this._config.subscriptionCode,
      AccessKey: this._config.accessKey,
      UserTag: this._config.userTag,
      JobID: _jobId,
      NoteType: _noteType as number,
      NewNote: _modifiedNote ?? ''
    };
    return await this.makePostRequest(url, requestData);
  }

  async FetchTranscription(_jobId: string) {
    Guard.Against.NullOrEmpty(_jobId, "Job Id");
    const url = this.getURL('/fetch-transcript');
    const requestData = {
      SubscriptionCode: this._config.subscriptionCode,
      AccessKey: this._config.accessKey,
      UserTag: this._config.userTag,
      JobID: _jobId,
    };
    return await this.makePostRequest(url, requestData);
  }

  async SendFeedback(_jobId: string, _rating: number, _comments?: string, _type?: string) {
    Guard.Against.NullOrEmpty(_jobId, "Job Id");
    Guard.Against.NullOrUndefined(_rating, "Rating");
    const url = this.getURL('/feedback').replace("/v1", "/v2");
    const requestData = {
      SubscriptionCode: this._config.subscriptionCode,
      AccessKey: this._config.accessKey,
      UserTag: this._config.userTag,
      JobID: _jobId,
      Rating: _rating,
      FeedBack: _comments ?? '',
      Type: _type ?? ''
    };
    return await this.makePostRequest(url, requestData);
  }

}


