import {isNamedSection, MarkMark} from './types'

export class MarkMarkRenderer {
    public render(mm: MarkMark, frontmatter: boolean = true): string {
        let mmLines: string[] = ['\n']

        // Write the frontmatter
        if ( frontmatter ) {
            mmLines.push(`[//]: #(markmark-syntax: ${mm.frontmatter.syntax})`)
            if (mm.frontmatter.authorName) mmLines.push(`[//]: #(markmark-author-name: ${mm.frontmatter.authorName})`)
            if (mm.frontmatter.authorEmail) mmLines.push(`[//]: #(markmark-author-email: ${mm.frontmatter.authorEmail})`)
            if (mm.frontmatter.authorHref) mmLines.push(`[//]: #(markmark-author-href: ${mm.frontmatter.authorHref})`)
        }

        for ( const section of mm.sections ) {
            mmLines.push('\n')

            // if this section has a title/description, write those out
            if ( isNamedSection(section) ) {
                mmLines.push(`# ${section.title}\n`)
                if ( section.description ) {
                    mmLines.push(`${section.description}\n`)
                }
            }

            for ( const link of section.links ) {
                let linkTitle = `- ${link.title}`

                if ( link.date ) {
                    linkTitle += `  (${this.formatDate(link.date)})`
                }

                if ( link.tags.length ) {
                    linkTitle += `  ${link.tags.map(x => '#' + x).join(' ')}`
                }

                mmLines.push(linkTitle)

                for ( const url of link.urls ) {
                    mmLines.push(`    - ${url}`)
                }
            }
        }

        return mmLines.join('\n')
    }

    private formatDate(date: Date): string {
        const year = date.getFullYear();
        const month = String(date.getMonth() + 1).padStart(2, '0'); // Months are zero-based
        const day = String(date.getDate()).padStart(2, '0');
        return `${year}-${month}-${day}`;
    }
}
