// Copyright (c) 2017, Matt Godbolt
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
//     * Redistributions of source code must retain the above copyright notice,
//       this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright
//       notice, this list of conditions and the following disclaimer in the
//       documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.

const asmDocs = require('./asm-docs'),
    props = require('../properties');

class Handler {
    constructor() {
        const asmProps = props.propsFor('asm-docs');
        this.staticMaxAgeSecs = asmProps('staticMaxAgeSecs', 10);
        this.atAndTSuffixRemover = /^([a-z]+)[blqw]$/i;
    }

    handle(req, res) {
        let info = asmDocs.getAsmOpcode(req.params.opcode);
        if (!info) {
            // If the opcode ends with an AT&T suffix, try removing that and giving it another go.
            // Ideally, we'd be smarter here, but this is a quick win.
            const suffixRemoved = this.atAndTSuffixRemover.exec(req.params.opcode);
            if (suffixRemoved) {
                info = asmDocs.getAsmOpcode(suffixRemoved[1]);
            }
        }
        if (this.staticMaxAgeSecs) {
            res.setHeader('Cache-Control', 'public, max-age=' + this.staticMaxAgeSecs);
        }
        if (req.accepts(['text', 'json']) === 'json') {
            res.send({found: !!info, result: info});
        } else {
            if (info)
                res.send(info.html);
            else
                res.send('Unknown opcode');
        }
    }
}

module.exports.Handler = Handler;
