import { Body, Controller, Get, Post, Query, UploadedFile, UseInterceptors } from '@nestjs/common';
import { PineconeService } from './pinecone.service';
import { AddDocumentDto, EditPromptDto, Upload, AddScrapUrlDto, transcriptDto } from './dto';
import { ApiBody, ApiConsumes } from '@nestjs/swagger';
import { FileInterceptor } from '@nestjs/platform-express';
import * as Multer from 'multer';
import { MessagePattern, Payload } from '@nestjs/microservices';


@Controller('pinecone')
export class PineconeController {
  constructor(private readonly pineconeService: PineconeService) { }


  @Post("add-document")
  async addDocument(@Body() body: AddDocumentDto) {
    try {
      return await this.pineconeService.addDocument(body.content)
    } catch (error) {
      throw error
    }
  }

  @Get("get-document")
  async getDocument(@Query() query: AddDocumentDto) {
    try {
      return await this.pineconeService.getDocument(query.content)
    } catch (error) {
      throw error
    }
  }

  @ApiConsumes('multipart/form-data')
  @ApiBody({ type: Upload })
  @UseInterceptors(FileInterceptor('file'))
  @Post("pdf-upload")
  async pdfUpload(@UploadedFile() file: Multer.file) {
    try {
      let res = await this.pineconeService.pdfUpload(file)
      return {
        message: 'Document processed successfully',
        chunks: res.length,
      };
    } catch (error) {
      throw error
    }
  }

  @ApiConsumes('multipart/form-data')
  @ApiBody({ type: Upload })
  @UseInterceptors(FileInterceptor('file'))
  @Post("excel-upload")
  async excelUpload(@UploadedFile() file: Multer.file) {
    try {
      let res = await this.pineconeService.excelUpload(file)
      return {
        message: 'Document processed successfully',
        // chunks: res.length,
      };
    } catch (error) {
      throw error
    }
  }

  // @ApiConsumes('multipart/form-data')
  // @ApiBody({ type: Upload })
  // @UseInterceptors(FileInterceptor('file'))
  @Post("url-upload")
  async scrapAndUpload(@Body() body: AddScrapUrlDto) {
    try {
      let res = await this.pineconeService.scrapAndUpload(body.url)
      return {
        message: 'Document processed successfully',
        // chunks: res.length,
      };
    } catch (error) {
      throw error
    }
  }
  @Get("get-answer")
  async getAnswer(@Query() query: AddDocumentDto) {
    try {
      try {
        return await this.pineconeService.getAnswer(query.content)
      } catch (error) {
        throw error
      }
    } catch (error) {
      throw error
    }
  }
    

  @MessagePattern('get-answer')
  async getAnswerService(@Payload() payload: AddDocumentDto) {
    try {
        return await this.pineconeService.getAnswer(payload.content)

    } catch (error) {
      throw error
    }
  }
  
  // @MessagePattern('rag/get-answer')
  // async getAnswerFromMicroservice(@Payload() payload: transcriptDto) {
  //   console.log("reinviteObj", reinviteObj);
  //   return "success"
  // }


  @Get("prompt")
  async getPrompt() {
    try {
      try {
        return await this.pineconeService.getPrompt()
      } catch (error) {
        throw error
      }
    } catch (error) {
      throw error
    }
  }

  @Post("edit-prompt")
  async editPrompt(@Body() body: EditPromptDto) {
    try {
      return await this.pineconeService.editPrompt(body.prompt)
    } catch (error) {
      throw error
    }
  }
}

