import { existsSync } from 'fs';
import { v4 as uuidV4, v5 as uuidV5, NIL as uuidNIL } from 'uuid';
import { getImg, postImg, getImgType } from './image';
import type { Thread, Comment } from '../models/Thread'
export async function processThreadIn(board: string, thread: Thread, comments = false) {
  if(!thread || !board) return;
  let imageId: string = thread.imageId;
  // if(existsSync(`dist/client/images/${imageId}`))
  if(existsSync(`public/images/${imageId}`))
	thread.imageId = `/images/${imageId}`;
  else
	thread.imageId = await getImg(imageId);
  thread.threadText = replaceURLs(thread.threadText, board, thread.id);
  if(!comments) return;
  for(let comment of thread.comments)
  {
    let cimageId = comment.imageId;
    // if(existsSync(`dist/client/images/${cimageId}`))
    if(existsSync(`public/images/${cimageId}`))
	  comment.imageId = `/images/${cimageId}`;
	else
	  comment.imageId = await getImg(cimageId);
    comment.commentText = replaceURLs(comment.commentText, board, thread.id);
  }
}
export async function processThreadOut(form: any): Thread {
  let img = form.get('image');
  let t: Thread = {
    id: uuidV4(),
    threadName: form.get('ThreadName'),
    threadCreator: uuidV5(form.get('iphash'), uuidNIL),
    threadText: form.get('ThreadText'),
    comments: [],
    creationDate: Date.now(),
    imageId: await postImg(img),
    fileType: getImgType(img),
  }
  return t;
}
export async function processCommentOut(form: any): Comment {
  let img = form.get('image');
  let c: Comment = {};
  c.id = uuidV4();
  c.commentCreator = uuidV5(form.get('iphash'), uuidNIL);
  c.commentText = form.get('CommentText');
  c.creationDate = Date.now();
  c.imageId = await postImg(img);
  c.fileType = getImgType(img);
  return c;
}
function replaceURLs(text: string, board: string, OPtid?: string): string {
  if(!text) return;
  if(OPtid) {
    let replyRegex = /(^|[^>])>>[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}/g;
    text = text.replace(replyRegex, (id) => {
	  let showid = id;
	  id = id.replace(/(>|\n| )/g, '');
	  if(id == OPtid) showid += "(OP)";
	  // this adds the targeted class
	  // to the target id when its hovered on
	  // and removes it when it stops hovering
	  return `  ${showid}  `;
    });
  }
  // link to thread on other board
  let otherthreadlinkRegex = />>>\/.*\/[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}/g;
  text = text.replace(otherthreadlinkRegex, (id) => {
    let link = id.slice(4);
    let parts = link.split('/');
    let linkid = parts[1]; let board = parts[0];
    return `  >>>/${board}/${linkid}  `
  });
  // link to thread on this board
  let threadlinkRegex = />>>[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}/g;
  text = text.replace(threadlinkRegex, (id) => {
    let linkid = id.slice(3); // remove the first >>>
    return `  ${id}  `
  });
  // link to another board
  let otherboardRegex = />>>\/.*\/($|[^0-9a-fA-F])/g;
  text = text.replace(otherboardRegex, (id) => {
    let boardid = id.split('/')[1];
    return `  >>>/${boardid}/  `
  });
  let newlineRegex = /(\r\n|\r|\n)/g;
  text = text.replace(newlineRegex, () => {
	return ' 
 '
  });
  let urlRegex = /(((https?:\/\/)|(www\.))[^\s]+)/g;
  return text.replace(urlRegex, (url) => {
	var hyperlink = url;
	if (!hyperlink.match('^https?:\/\/')) {
	  hyperlink = 'http://' + hyperlink;
	}
	return ' ' + url + ' '
  });
}