import fs from 'fs'
import theme from '../themes/themes.json'

const BASE_URL = 'https://codestats-readme.vercel.app'
// const BASE_URL = 'http://localhost:3000'

const TARGET_FILE = './themes/README.md'
const LINKS_FLAG = '<!-- LINKS_FLAG -->'

const PROFILE_CARD_TABLE_FLAG = '<!-- PROFILE_TABLE -->'
const TOP_LANGS_CARD_TABLE_FLAG = '<!-- TOP_LANGS_TABLE -->'
const HISTORY_CARD_TABLE_FLAG = '<!-- HISTORY_TABLE -->'

const THEME_TEMPLATE = `## Available Themes

<!-- DO NOT EDIT THIS FILE DIRECTLY -->

With inbuilt themes you can customize the look of the card without doing any manual customization.

Use \`?theme=THEME_NAME\` parameter like so :-

\`\`\`md
![Anurag's github stats](${BASE_URL}/api?username=aviortheking&theme=dark&show_icons=true)
\`\`\`

## Profile

| | | |
| :--: | :--: | :--: |
${PROFILE_CARD_TABLE_FLAG}

## History Card

| | | |
| :--: | :--: | :--: |
${HISTORY_CARD_TABLE_FLAG}

## Top Langs Card

| | | |
| :--: | :--: | :--: |
${TOP_LANGS_CARD_TABLE_FLAG}

${LINKS_FLAG}

[add-theme]: https://github.com/aviortheking/codestats-readme/edit/master/themes/index.js

Wanted to add a new theme? Consider reading the [contribution guidelines](../CONTRIBUTING.md#themes-contribution) :D
`

const createTopLangsMdLink = (theme: string) => {
	return `\n[top_langs_${theme}]: ${BASE_URL}/api/top-langs/?username=aviortheking&theme=${theme}`
}
const createProfileMdLink = (theme: string) => {
	return `\n[profile_${theme}]: ${BASE_URL}/api?username=aviortheking&show_icons=true&theme=${theme}`
}

const createHistoryMdLink = (theme: string) => {
	return `\n[history_${theme}]: ${BASE_URL}/api/history?username=Aviortheking&layout=horizontal&theme=${theme}`
}

const generateLinks = (fn: typeof createHistoryMdLink) => {
	return Object.keys(theme)
		.map((name) => fn(name))
		.join('')
}

const createTableItem = ({ link, label }: {link: string, label: string}) => {
	if (!link || !label) return ''
	return `\`${label}\` ![${link}][${link}]`
}
const generateTable = (prefix: string) => {
	const rows = []
	const themes = Object.keys(theme)

	for (let i = 0; i < themes.length; i += 3) {
		const one = prefix + themes[i]
		const two = prefix + themes[i + 1]
		const three = prefix + themes[i + 2]

		const tableItem1 = createTableItem({ link: one, label: themes[i] })
		const tableItem2 = createTableItem({ link: two, label: themes[i + 1] })
		let tableItem3 = createTableItem({ link: three, label: themes[i + 2] })

		if (three === undefined) {
			tableItem3 = '[Add your theme][add-theme]'
		}
		rows.push(`| ${tableItem1} | ${tableItem2} | ${tableItem3} |`)

		// if it's the last row & the row has no empty space push a new row
		if (three && i + 3 === themes.length) {
			rows.push('| [Add your theme][add-theme] | | |')
		}
	}

	return rows.join('\n')
}

const buildReadme = () => {
	return THEME_TEMPLATE.split('\n')
		.map((line) => {
			if (line.includes(LINKS_FLAG)) {
				return generateLinks(createTopLangsMdLink) + generateLinks(createHistoryMdLink) + generateLinks(createProfileMdLink)
			}
			if (line.includes(PROFILE_CARD_TABLE_FLAG)) {
				return generateTable('profile_')
			}
			if (line.includes(TOP_LANGS_CARD_TABLE_FLAG)) {
				return generateTable('top_langs_')
			}
			if (line.includes(HISTORY_CARD_TABLE_FLAG)) {
				return generateTable('history_')
			}
			return line
		})
		.join('\n')
}

fs.writeFileSync(TARGET_FILE, buildReadme())
