const request = require('request')
const Settings = require('settings-sharelatex')

const buildUrl = (path) =>
  `http://${Settings.internal.clsi.host}:${Settings.internal.clsi.port}/${path}`

const url = buildUrl(`project/smoketest-${process.pid}/compile`)

module.exports = {
  sendNewResult(res) {
    this._run((error) => this._sendResponse(res, error))
  },
  sendLastResult(res) {
    this._sendResponse(res, this._lastError)
  },
  triggerRun(cb) {
    this._run((error) => {
      this._lastError = error
      cb(error)
    })
  },

  _lastError: new Error('SmokeTestsPending'),
  _sendResponse(res, error) {
    let code, body
    if (error) {
      code = 500
      body = error.message
    } else {
      code = 200
      body = 'OK'
    }
    res.contentType('text/plain')
    res.status(code).send(body)
  },
  _run(done) {
    request.post(
      {
        url,
        json: {
          compile: {
            resources: [
              {
                path: 'main.tex',
                content: `\
% Membrane-like surface
% Author: Yotam Avital
\\documentclass{article}
\\usepackage{tikz}
\\usetikzlibrary{calc,fadings,decorations.pathreplacing}
\\begin{document}
\\begin{tikzpicture}
  \\def\\nuPi{3.1459265}
  \\foreach \\i in {5,4,...,2}{% This one doesn't matter
    \\foreach \\j in {3,2,...,0}{% This will crate a membrane
                               % with the front lipids visible
      % top layer
      \\pgfmathsetmacro{\\dx}{rand*0.1}% A random variance in the x coordinate
      \\pgfmathsetmacro{\\dy}{rand*0.1}% A random variance in the y coordinate,
                                     % gives a hight fill to the lipid
      \\pgfmathsetmacro{\\rot}{rand*0.1}% A random variance in the
                                      % molecule orientation
      \\shade[ball color=red] ({\\i+\\dx+\\rot},{0.5*\\j+\\dy+0.4*sin(\\i*\\nuPi*10)}) circle(0.45);
      \\shade[ball color=gray] (\\i+\\dx,{0.5*\\j+\\dy+0.4*sin(\\i*\\nuPi*10)-0.9}) circle(0.45);
      \\shade[ball color=gray] (\\i+\\dx-\\rot,{0.5*\\j+\\dy+0.4*sin(\\i*\\nuPi*10)-1.8}) circle(0.45);
      % bottom layer
      \\pgfmathsetmacro{\\dx}{rand*0.1}
      \\pgfmathsetmacro{\\dy}{rand*0.1}
      \\pgfmathsetmacro{\\rot}{rand*0.1}
      \\shade[ball color=gray] (\\i+\\dx+\\rot,{0.5*\\j+\\dy+0.4*sin(\\i*\\nuPi*10)-2.8}) circle(0.45);
      \\shade[ball color=gray] (\\i+\\dx,{0.5*\\j+\\dy+0.4*sin(\\i*\\nuPi*10)-3.7}) circle(0.45);
      \\shade[ball color=red] (\\i+\\dx-\\rot,{0.5*\\j+\\dy+0.4*sin(\\i*\\nuPi*10)-4.6}) circle(0.45);
    }
  }
\\end{tikzpicture}
\\end{document}\
`
              }
            ]
          }
        }
      },
      (error, response, body) => {
        if (error) return done(error)
        if (!body || !body.compile || !body.compile.outputFiles) {
          return done(new Error('response payload incomplete'))
        }

        let pdfFound = false
        let logFound = false
        for (const file of body.compile.outputFiles) {
          if (file.type === 'pdf') pdfFound = true
          if (file.type === 'log') logFound = true
        }

        if (!pdfFound) return done(new Error('no pdf returned'))
        if (!logFound) return done(new Error('no log returned'))
        done()
      }
    )
  }
}
