import * as plugins from './smartocr.plugins';
import * as paths from './smartocr.paths';

export class SmartOcr {
  // STATIC
  public static async createAndInit() {
    const smartocrInstance = new SmartOcr();
    await smartocrInstance.init();
    return smartocrInstance;
  }

  // INSTANCE

  public readyDeferred = plugins.smartpromise.defer();
  public smartshellInstance: plugins.smartshell.Smartshell;

  public async processPdfBuffer (pdfBufferArg: Buffer): Promise<Buffer> {
    const uniqueString = plugins.smartunique.uni('doc_');
    const originalPath = plugins.path.join(paths.noGitDir, `${uniqueString}.pdf`);
    const processedPath = plugins.path.join(paths.noGitDir, `${uniqueString}_processed.pdf`);
    const originalSmartfile = await plugins.smartfile.Smartfile.fromBuffer(originalPath, pdfBufferArg);
    await originalSmartfile.write();
    await this.smartshellInstance.exec(`ocrmypdf --rotate-pages ${originalPath} ${processedPath}`);
    const processedSmartfile = await plugins.smartfile.Smartfile.fromFilePath(processedPath);
    await originalSmartfile.delete();
    await processedSmartfile.delete();
    return processedSmartfile.contentBuffer;
  }

  constructor() {
    this.smartshellInstance = new plugins.smartshell.Smartshell({
      executor: 'bash'
    });
  }

  public async init() {
    await plugins.smartfile.fs.ensureDir(paths.noGitDir);
    const result = await plugins.smartshell.which('ocrmypdf');
  }
}