import peg from 'pegjs';
import { MfmNode } from './node';
const parser: peg.Parser = require('./parser');

export function parse(input: string): MfmNode[] {
	const nodes = parser.parse(input, { startRule: 'fullParser' });
	return nodes;
}

export function parsePlain(input: string): MfmNode[] {
	const nodes = parser.parse(input, { startRule: 'plainParser' });
	return nodes;
}

function nodeStringify(node: MfmNode): string {
	switch(node.type) {
		// block
		case 'quote': {
			return toString(node.children).split('\n').map(line => `>${line}`).join('\n');
		}
		case 'search': {
			break;
		}
		case 'blockCode': {
			break;
		}
		case 'mathBlock': {
			break;
		}
		case 'center': {
			break;
		}
		// inline
		case 'emoji': {
			break;
		}
		case 'bold': {
			break;
		}
		case 'small': {
			break;
		}
		case 'italic': {
			break;
		}
		case 'strike': {
			break;
		}
		case 'inlineCode': {
			break;
		}
		case 'mathInline': {
			break;
		}
		case 'mention': {
			break;
		}
		case 'hashtag': {
			break;
		}
		case 'url': {
			break;
		}
		case 'link': {
			break;
		}
		case 'fn': {
			break;
		}
		case 'text': {
			return node.props.text;
		}
	}
	return '';
}

export function toString(nodes: MfmNode[]): string {
	return nodes.map(node => nodeStringify(node)).join('');
}

export {
	MfmNode,
	MfmBlock,
	MfmInline,

	// block
	MfmQuote,
	MfmSearch,
	MfmCodeBlock,
	MfmMathBlock,
	MfmCenter,

	// inline
	MfmEmoji,
	MfmBold,
	MfmSmall,
	MfmItalic,
	MfmStrike,
	MfmInlineCode,
	MfmMathInline,
	MfmMention,
	MfmHashtag,
	MfmUrl,
	MfmLink,
	MfmFn,
	MfmText
} from './node';