import { promisify } from 'node:util'
import Client from './helpers/Client.js'
import ClsiApp from './helpers/ClsiApp.js'
import { expect } from 'chai'

const sleep = promisify(setTimeout)

describe('Stop compile', function () {
  before(async function () {
    this.request = {
      options: {
        timeout: 100,
      }, // seconds
      resources: [
        {
          path: 'main.tex',
          content: `\
\\documentclass{article}
\\begin{document}
\\def\\x{Hello!\\par\\x}
\\x
\\end{document}\
`,
        },
      ],
    }
    this.project_id = Client.randomId()
    await ClsiApp.ensureRunning()

    // start the compile in the background
    Client.compile(this.project_id, this.request)
      .then(body => {
        this.compileResult = { body }
      })
      .catch(error => {
        this.compileResult = { error }
      })

    // wait for 1 second before stopping the compile
    await sleep(1000)

    try {
      const res = await Client.stopCompile(this.project_id)
      this.stopResult = { res }
    } catch (error) {
      this.stopResult = { error }
    }

    // allow time for the compile request to terminate
    await sleep(1000)
  })

  it('should force a compile response with an error status', function () {
    expect(this.stopResult.error).not.to.exist
    expect(this.stopResult.res.status).to.equal(204)
    expect(this.compileResult.error).not.to.exist
    expect(this.compileResult.body.compile.status).to.equal('terminated')
    expect(this.compileResult.body.compile.error).to.equal('terminated')
  })

  it('should return the log output file name', function () {
    const outputFilePaths = this.compileResult.body.compile.outputFiles.map(
      x => x.path
    )
    outputFilePaths.should.include('output.synctex(busy)') // compile was still pending
    outputFilePaths.should.include('output.log')
  })

  it('should work with not pending compile', async function () {
    const res = await Client.stopCompile(this.project_id)
    expect(res.status).to.equal(204)
  })
})
