/* ### Electron Specific JavaScript ### */
// import crypto from 'crypto';
// import {fs} from 'fs';
// import path from 'path';
// const crypto = require('crypto');
// const fs = require('fs');
// const fs_promises = require('node:fs/promises');
// const path = require('path');
// const { ipcRenderer } = require('electron');

// function sleep(milliseconds) {
//     const date = Date.now();
//     let currentDate = null;
//     do {
//         currentDate = Date.now();
//     } while (currentDate - date < milliseconds);
// }

// // exports.check_hash_file_cache should no longer be needed with this.
// // Updated 2022-10-11
// export let check_hash_file_cache_v2 = async function check_hash_file_cache_v2({local_file_cache_path, hash, check_hash=false}) {
//     console.log('*** check_hash_file_cache_v2() ***');
//     console.log(`Host File Cache Path: ${local_file_cache_path}; Hash: ${hash}`);

//     let hash_filename = `${hash}.file`;

//     let subdirectory = hash_filename.substring(0,2);
//     let subdirectory_path = path.join(local_file_cache_path, subdirectory);
//     if (fs.existsSync(subdirectory_path)) {
//     } else {
//         console.log(`Hashed file subdirectory not found in cache: ${subdirectory_path}`);
//         return null;
//     }

//     let hash_file_cache_path = path.join(subdirectory_path, hash_filename);

//     if (fs.existsSync(hash_file_cache_path)) {
//         console.log(`Hashed file exists in cache: ${hash_file_cache_path}`);

//         if (check_hash) {
//             const file_buffer = fs.readFileSync(hash_file_cache_path);
//             const file_hash_sha256 = crypto.createHash('sha256');
//             file_hash_sha256.update(file_buffer);

//             const file_hash_sha256_check = file_hash_sha256.digest('hex');
//             if (file_hash_sha256_check == hash) {
//                 console.log('File hash match', file_hash_sha256_check);
//             } else {
//                 console.log('File hash does not match', file_hash_sha256_check);
//                 return false;
//             }
//         }

//         return true;
//     } else {
//         console.log(`Hashed file not found in cache: ${hash_file_cache_path}`);
//         return null;
//     }
// }

// Updated 2022-05-07
export let kill_processes = async function kill_processes({ process_name_li = [] }) {
	console.log('*** kill_processes() ***');
	console.log(`Process Name List: ${process_name_li}`);

	let fail_flag = null;
	if (process_name_li) {
		for (let i = 0; i < process_name_li.length; i++) {
			// separate the keys and the values
			let process_name = process_name_li[i];
			let signal = null;

			if (process_name == 'osit_aperture_wrapper') {
				signal = 'INT'; // INT (interrupt) correctly stops the wrapper
			}

			let kill_processes_result = await native_app.kill_processes({
				process_name: process_name,
				signal: signal
			});
			console.log(kill_processes_result);
			if (kill_processes_result) {
				console.log('Killed process.');
				// return kill_processes_result;
			} else {
				console.log('Did not kill process. Something went wrong.');
				fail_flag = true;
				// return false;
			}
		}
	}

	return fail_flag;

	// let kill_processes_result = await native_app.kill_processes({process_name: process_name});
	// console.log(kill_processes_result);
	// if (kill_processes_result) {
	//     console.log('Killed process.');
	//     return kill_processes_result;
	// } else {
	//     console.log('Did not kill process. Something went wrong.');
	//     return false;
	// }
};

// Updated 2022-05-06
export let open_local_file = async function open_local_file({ file_path, filename }) {
	console.log('*** open_local_file() ***');
	console.log(`File Path: ${file_path}; Filename: ${filename}`);

	console.log(
		'Process: Check local hash file cache, Download hash file to cache, and Open cached hash file after copying to temp directory'
	);

	// let check_local_file_result = await native_app.check_local_file({local_file_path: file_path, filename: filename});
	// console.log(check_local_file_result);
	// if (check_local_file_result) {
	//     console.log('Local file found.');
	// } else {
	//     console.log('Local file not found. Will not attempt to open.');
	//     return false;
	// }

	// console.log('Local file file found and ready to be opened.');
	let open_local_file_result = await native_app.open_local_file({
		local_file_path: file_path,
		filename: filename
	});
	console.log(open_local_file_result);
	if (open_local_file_result) {
		console.log('Local file was opened.');
		return open_local_file_result;
	} else {
		console.log('Local file was not opened. Something went wrong.');
		return false;
	}
};

// exports.open_local_file should no longer be needed with this.
// Updated 2022-10-11
export let open_local_file_v2 = async function open_local_file_v2({ file_path, filename }) {
	console.log('*** open_local_file_v2() ***');
	console.log(`Local File Path: ${file_path}; Filename: ${filename}`);

	console.log(
		'Process: Check local hash file cache, Download hash file to cache, and Open cached hash file after copying to temp directory'
	);

	let open_local_file_result = await ipcRenderer
		.invoke('open_local_file', file_path, filename)
		.then((result) => {
			console.log('IPC open local file finished');
			if (result) {
				console.log('Local file was opened.');
				return result;
			} else {
				console.log('Local file was not opened. Something went wrong.');
				console.log(result);
				return false;
			}

			console.log(result);
			return true;
		});

	return open_local_file_result;
};

// // Updated 2022-05-06
// export let open_hash_file_to_temp = async function open_hash_file_to_temp({local_file_cache_path, hash, host_file_temp_path, filename}) {
//     console.log('*** open_hash_file_to_temp() ***');
//     console.log(`Host File Cache Path: ${local_file_cache_path}; Hash: ${hash}; Host File Temp Path: ${host_file_temp_path}; Filename: ${filename}`);

//     console.log('Process: Check local hash file cache, Download hash file to cache, and Open cached hash file after copying to temp directory');

//     let open_hash_file_to_temp_result = await native_app.open_hash_file_to_temp({local_file_cache_path: local_file_cache_path, hash: hash, host_file_temp_path: host_file_temp_path, filename: filename});
//     console.log(open_hash_file_to_temp_result);
//     if (open_hash_file_to_temp_result) {
//         console.log('Local hash file was opened from temp directory.');
//         return open_hash_file_to_temp_result;
//     } else {
//         console.log('Local hash file was not opened from the temp directory. Something went wrong.');
//         return false;
//     }
// }

// // exports.open_hash_file_to_temp should no longer be needed with this.
// // Updated 2022-10-11
// export let open_hash_file_to_temp_v2 = async function open_hash_file_to_temp_v2({local_file_cache_path, hash, host_file_temp_path, filename}) {
//     console.log('*** open_hash_file_to_temp_v2() ***');
//     console.log(`Host File Cache Path: ${local_file_cache_path}; Hash: ${hash}; Host File Temp Path: ${host_file_temp_path}; Filename: ${filename}`);

//     console.log('Process: Check local hash file cache, Download hash file to cache, and Open cached hash file after copying to temp directory');

//     let subdirectory = hash.substring(0,2);
//     let subdirectory_path = path.join(local_file_cache_path, subdirectory);
//     if (fs.existsSync(subdirectory_path)) {
//     } else {
//         console.log(`Hashed file subdirectory not found in cache: ${subdirectory_path}`);
//         return null;
//     }

//     let hash_filename = hash+'.file';
//     let full_cache_file_path = path.join(subdirectory_path, hash_filename);
//     console.log(full_cache_file_path);

//     const file_buffer = fs.readFileSync(full_cache_file_path);
//     const file_hash_sha256 = crypto.createHash('sha256');
//     file_hash_sha256.update(file_buffer);

//     const file_hash_sha256_check = file_hash_sha256.digest('hex');
//     if (file_hash_sha256_check == hash) {
//         console.log('File hash match', file_hash_sha256_check);
//     } else {
//         console.log('File hash does not match', file_hash_sha256_check);
//         // await setTimeout(async () => {console.log('Done waiting????'); open_file_clicked = false;}, 5000);
//         // sleep(6000);
//         // console.log('???????? WAITED X SECONDS ????????');
//         return false;
//     }

//     let open_hash_file_to_temp_result = await ipcRenderer.invoke('open_hash_file_to_temp', subdirectory_path, hash, host_file_temp_path, filename).then((result) => {
//         console.log('IPC open hash file to temp finished');
//         if (result) {
//             console.log('Local hash file was opened from temp directory.');
//             return result;
//         } else {
//             console.log('Local hash file was not opened from the temp directory. Something went wrong.');
//             console.log(result);
//             return false;
//         }
//     })

//     return open_hash_file_to_temp_result;
// }

// Updated 2022-05-07
export let run_cmd = async function run_cmd({ cmd = null, return_stdout = null }) {
	console.log('*** run_cmd() ***');

	let run_cmd_result = await native_app
		.run_cmd({ cmd: cmd, return_stdout: return_stdout })
		.then(function (result) {
			if (result) {
				console.log('Command ran');
			} else {
				console.log('Command did not run. Something went wrong.');
				return false;
			}
			if (return_stdout) {
				return result;
			} else {
				return true;
			}
		});

	console.log('Run Command Result:', run_cmd_result);

	return run_cmd_result;
};

// Updated 2022-10-27
export let run_cmd_sync = function run_cmd_sync({ cmd = null, return_stdout = null }) {
	console.log('*** run_cmd_sync() ***');

	let run_cmd_result = native_app.run_cmd_sync({ cmd: cmd, return_stdout: return_stdout });

	// if (run_cmd_result) {
	//     console.log('Command ran');
	// } else {
	//     console.log('Command did not run. Something went wrong.');
	//     // return false;
	// }

	// if (return_stdout) {
	//     return run_cmd_result;
	// } else {
	//     return true;
	// }

	console.log('Run Command Result:', run_cmd_result);

	return run_cmd_result;
};

// Updated 2022-05-07
export let run_osascript = async function run_osascript({
	cmd = null,
	interactive = false,
	language = null,
	flags = 'h',
	program_file = null
}) {
	console.log('*** run_osascript() ***');

	let run_osascript_result = await native_app.run_osascript({
		cmd: cmd,
		interactive: interactive,
		language: language,
		flags: flags,
		program_file: program_file
	});

	console.log(run_osascript_result);

	if (run_osascript_result) {
		console.log('Apple Script ran');
	} else {
		console.log('Apple Script did not run. Something went wrong.');
	}

	return run_osascript_result;
};

// Updated 2022-05-07
export let get_device_info = async function get_device_info({ event_device_id }) {
	console.log('*** get_device_info() ***');

	console.log(event_device_id);

	let get_device_info_result = await native_app.get_device_info();

	console.log(get_device_info_result);

	if (get_device_info_result) {
		console.log('Success');
	} else {
		console.log('Failed? Something went wrong.');
	}

	return get_device_info_result;
};
