import { mkdir, rename, rm } from "node:fs/promises"

const segments = "ui,model,api"
const args = Bun.argv.slice(2)

function printUsageAndExit(): never {
	console.error(
		"Ошибка: Необходимо указать <название слоя> и <название компонента>",
	)
	console.log("Пример: bun gc features MyButton")
	process.exit(1)
}

function runShell(command: string): void {
	console.log(`Выполняется: ${command}`)

	const result = Bun.spawnSync({
		cmd: ["sh", "-lc", command],
		stdin: "inherit",
		stdout: "inherit",
		stderr: "inherit",
	})

	if (result.exitCode !== 0) {
		const suffix = result.signalCode ? ` (signal ${result.signalCode})` : ""
		throw new Error(`Команда завершилась с кодом ${result.exitCode}${suffix}`)
	}
}

if (args.length < 2) {
	printUsageAndExit()
}

const layer = args[0]
const component = args[1]
const otherArgs = args.slice(2).join(" ")

let componentPath = "./src/"

if (layer === "shared") {
	componentPath += `${layer}/ui/${component}`
} else if (layer === "app") {
	componentPath += `${layer}/${component}`
} else if (layer === "entity" || layer === "entities") {
	componentPath += `entities/${component}`
} else {
	componentPath += `${layer}s/${component}`
}

const fsdCommand = `fsd ${layer} ${component} ${otherArgs} --segments ${segments} -r src`

if (layer !== "shared") {
	try {
		runShell(fsdCommand)
	} catch (error) {
		console.error(`Ошибка выполнения команды: ${(error as Error).message}`)
		process.exit(1)
	}
} else {
	await mkdir(componentPath, { recursive: true })
	console.log("Пропущен fsd для shared: создаем компонент вручную")
}

console.log(`Удаление индекс файла: ${componentPath}/index.ts`)

try {
	await rm(`${componentPath}/index.ts`, { force: true })
} catch (error) {
	console.error(`Ошибка выполнения команды: ${(error as Error).message}`)
	process.exit(1)
}

const createTsx = `bunx generate-react-cli component ${component} --flat --path ${componentPath}`

try {
	runShell(createTsx)
} catch (error) {
	console.error(`Ошибка выполнения команды: ${(error as Error).message}`)
	process.exit(1)
}

console.log("Перемещение файлов...")

const oldPath = `${componentPath}/${component}`
const newPath = `${componentPath}`

try {
	await mkdir(`${newPath}/ui`, { recursive: true })
	await mkdir(`${newPath}/model`, { recursive: true })

	await rename(`${oldPath}.tsx`, `${newPath}/ui/${component}.tsx`)
	console.log("TSX файл перемещен")

	await rename(
		`${oldPath}.module.scss`,
		`${newPath}/ui/${component}.module.scss`,
	)
	console.log("SCSS файл перемещен")

	await rename(`${oldPath}.d.ts`, `${newPath}/model/${component}.d.ts`)
	console.log("D.TS файл перемещен")
} catch (error) {
	console.error(`Ошибка выполнения команды: ${(error as Error).message}`)
	process.exit(1)
}
