import {
    Client,
    Events,
    GatewayIntentBits
} from 'discord.js';
import fs from 'fs';

import {
    createWriteStream,
    existsSync
} from 'fs';

import {
    parse
} from 'node-html-parser';

import { 
	pipeline 
} from 'node:stream/promises';

import path from 'node:path';
import axios from 'axios';
const client = new Client({
    intents: [GatewayIntentBits.Guilds]
});

const config = JSON.parse(fs.readFileSync(path.resolve("config", "config.json")));

process.env.TZ = config.timezone; 

client.once(Events.ClientReady, readyClient => {
    console.log(`Ready! Logged in as ${readyClient.user.tag}`);
});

async function get_rain_image() {
	try {
		const radar_image = await axios.get('https://weather.bangkok.go.th/Images/Radar/radar.gif', {
			responseType: "stream"
		});
			
		const radar_image_size = radar_image.headers['content-length'];
		console.log("Got Radar Data");
		return [radar_image, radar_image_size];
	} catch (error) {
		console.error(error);
		return [error];
	}
}

async function get_radar_caption() {
	const response = await axios.get('https://weather.bangkok.go.th/Radar/RadarHighResolution.aspx');

	let root = parse(response.data);
	console.log("Got Radar Caption")
	return root.querySelector('#repeaDaily_lblDESCRIPTION_0').childNodes[0]._rawText;
}

const curr_image_path = path.resolve("data", "current_radar.gif");

client.on('ready', () => {
	(async () => {
		const channel = client.channels.cache.get(config.room);
		
		let radar_image = await get_rain_image();
		let radar_caption = await get_radar_caption();

		await pipeline(
			radar_image[0].data,
			fs.createWriteStream(curr_image_path)
		);
		console.log("File Saved");
			
		console.log("Updating on boot");
		
		let date = new Date().toLocaleString('th-TH');

		let caption = `# Weather Update\n## ${date}\n${radar_caption}`
		
		let message = await channel.send({
			content: caption,
	        files: [curr_image_path]
	    });
	    
	    let message_id = message.id;
	    console.log(`Sent ${message.id}: ${message.content}`);
				
		setInterval(async () => {
		 	let curr_image_size = fs.statSync(curr_image_path).size;

		 	let radar_image = await get_rain_image();
		 	let radar_caption = await get_radar_caption();

            await pipeline(
            	radar_image[0].data,
            	fs.createWriteStream(curr_image_path)
            );
            console.log("File Saved");

            let radar_image_size = radar_image[1];
            
            console.log("Current: " + curr_image_size);
            console.log("New: " + radar_image_size);
            
            if(radar_image_size != curr_image_size) {
            	console.log("File change detected!");

				await channel.messages.delete(message_id);
				console.log("Delete old message");
				
				let date = new Date().toLocaleString('th-TH');

				let caption = `# Weather Update\n## ${date}\n${radar_caption}`
				
				let message = await channel.send({
					content: caption,
			        files: [curr_image_path]
			    });
                
                console.log(`Sent ${message.id}: ${message.content}`);
				message_id = message.id;
				console.log(message_id);
            } else {
                console.log("No change in data, go on.");
            }
		}, 60000); 
	})();
});

client.on(Events.ShardError, error => {
   console.log('A websocket connection encountered an error: ', error); 
});

process.on('unhandledRejection', error => {
    console.error(error); 
});

client.login(config.token);
