const express = require('express');
const app = express();
const { RtcTokenBuilder, RtcRole } = require('agora-access-token');

const { v4: uuidv4 } = require('uuid');
const apn = require('apn');
var bodyParser = require('body-parser')

const APP_ID = '26232624bdf94345b1a7e82f6aac837c';
const APP_CERTIFICATE = 'abaa5b68ae0d4a54943cdc717b8804ae';
const port = 3000;

// app.use(bodyParser.urlencoded());
app.use(bodyParser.json());

const nocache = (_, resp, next) => {
// 	resp.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
// 	resp.header('Expires', '-1');
// 	resp.header('Pragma', 'no-cache');
	next();
};

app.get('/rtc/:channel/:role/:tokentype/:uid', nocache, generateRTCToken);

app.get('/', (req, res) => {
	res.send('Hello World!');
});

app.listen(port, () => {
    console.clear();
	console.log(`Example app listening on port ${port}`);
});

function generateRTCToken(req, resp) {
	const channelName = req.params.channel;
	if (!channelName) {
		return resp.status(500).json({ error: 'channel is required' });
	}
	let uid = req.params.uid;
	if (!uid || uid === '') return resp.status(500).json({ error: 'uid is required' });
	// get role
	let role;
	if (req.params.role === 'publisher') {
		role = RtcRole.PUBLISHER;
	} else if (req.params.role === 'audience') {
		role = RtcRole.SUBSCRIBER;
	} else {
		return resp.status(500).json({ error: 'role is incorrect' });
	}

	let expireTime = req.query.expiry;
	if (!expireTime || expireTime === '') {
		expireTime = 3600;
	} else {
		expireTime = parseInt(expireTime, 10);
	}

	const currentTime = Math.floor(Date.now() / 1000);
	const privilegeExpireTime = currentTime + expireTime;

	let token;
	if (req.params.tokentype === 'userAccount') {
		token = RtcTokenBuilder.buildTokenWithAccount(APP_ID, APP_CERTIFICATE, channelName, uid, role, privilegeExpireTime);
	} else if (req.params.tokentype === 'uid') {
		token = RtcTokenBuilder.buildTokenWithUid(APP_ID, APP_CERTIFICATE, channelName, uid, role, privilegeExpireTime);
	} else {
		return resp.status(500).json({ error: 'token type is invalid' });
	}

    console.log('generatedRTCToken', token);
	return resp.json({ rtcToken: token });
}


// USING FOR NANIESONWHEELZ
app.post('/sendApnsNow', async function(req, res){
    
    const { tokens, payload } = req.body;
    console.log(req.body);
    var apnProvider = new apn.Provider({
        cert: './certs/dev_cert.pem', key: './certs/dev_key.pem',
        production: true
    });
    
    var note = new apn.Notification();
    note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.
    note.payload = {
        ...req.body.payload,
        uuid: await uuidv4()
    };
    
    note.topic = "com.app.nanniesonwheelz.voip";
    note.priority = 5;
    
    // console.log(note);
    
    apnProvider.send(note, [ req.body.tokens ]).then( (result) => {
        // console.log( colors.red('apnProvider - result'), colors.yellow( JSON.stringify(result) ) );
        console.log(JSON.stringify(result));
    });
    
    return res.status(200).send( JSON.stringify(req.body) );
});
