const fs = require("fs");

const path = require("path");



const fourslashCasesNameArray = [

    "addMemberNotInNodeModulesDeclarationFile.ts",

    "codeFixAddMissingFunctionDeclaration16.ts",

    "codeFixCannotFindModule_all.ts",

    "codeFixCannotFindModule_suggestion_falsePositive.ts",

    "codeFixCannotFindModule_suggestion_js.ts",

    "codeFixCannotFindModule_suggestion.ts",

    "codeFixCannotFindModule.ts",

    "codeFixGenerateDefinitions.ts",

    "completionEntryForClassMembers_StaticWhenBaseTypeIsNotResolved.ts",

    "completionForStringLiteralNonrelativeImport1.ts",

    "completionForStringLiteralNonrelativeImport2.ts",

    "completionForStringLiteralNonrelativeImport3.ts",

    "completionForStringLiteralNonrelativeImport4.ts",

    "completionForStringLiteralNonrelativeImport7.ts",

    "completionForStringLiteralNonrelativeImport10.ts",

    "completionForStringLiteralNonrelativeImport11.ts",

    "completionForStringLiteralNonrelativeImport13.ts",

    "completionForStringLiteralNonrelativeImportTypings3.ts",

    "completionInJsDocQualifiedNames.ts",

    "completionListForExportEquals.ts",

    "completionListForExportEquals2.ts",

    "completionListInImportClause05.ts",

    "completionsImport_compilerOptionsModule.ts",

    "completionsImport_default_symbolName.ts",

    "completionsImport_defaultFalsePositive.ts",

    "completionsImport_exportEqualsNamespace_noDuplicate.ts",

    "completionsImport_filteredByInvalidPackageJson_direct.ts",

    "completionsImport_filteredByPackageJson_@typesImplicit.ts",

    "completionsImport_filteredByPackageJson_@typesOnly.ts",

    "completionsImport_filteredByPackageJson_ambient.ts",

    "completionsImport_filteredByPackageJson_direct.ts",

    "completionsImport_filteredByPackageJson_nested.ts",

    "completionsImport_filteredByPackageJson_peerDependencies.ts",

    "completionsImport_filteredByPackageJson_reexport.ts",

    "completionsImport_filteredByPackageJson_reexport2.ts",

    "completionsImport_filteredByPackageJson_reexport3.ts",

    "completionsImport_filteredByPackageJson_reexport4.ts",

    "completionsImport_notFromUnrelatedNodeModules.ts",

    "completionsImport_umdModules1_globalAccess.ts",

    "completionsImport_umdModules2_moduleExports.ts",

    "completionsImport_umdModules3_script.ts",

    "completionsPathsJsonModule.ts",

    "completionsPaths.ts",

    "completionsPaths_fromTypings.ts",

    "completionsPaths_importType.ts",

    "documentHighlights_moduleImport_filesToSearch.ts",

    "documentHighlights_moduleImport_filesToSearchWithInvalidFile.ts",

    "duplicatePackageServices_fileChanges.ts",

    "exportEqualNamespaceClassESModuleInterop.ts",

    "findAllReferencesTripleSlash.ts",

    "getEditsForFileRename_ambientModule.ts",

    "getEditsForFileRename_directory_noUpdateNodeModulesImport.ts",

    "getEditsForFileRename_nodeModuleDirectoryCase.ts",

    "getEditsForFileRename_symlink.ts",

    "goToDefinition_untypedModule.ts",

    "importFixesGlobalTypingsCache.ts",

    "importFixesWithPackageJsonInSideAnotherPackage.ts",

    "importJsNodeModule1.ts",

    "importJsNodeModule2.ts",

    "importJsNodeModule3.ts",

    "importJsNodeModule4.ts",

    "importNameCodeFixExistingImport5.ts",

    "importNameCodeFixExistingImport6.ts",

    "importNameCodeFixNewImportFromAtTypes.ts",

    "importNameCodeFixNewImportFromAtTypesScopedPackage.ts",

    "importNameCodeFixNewImportIndex_notForClassicResolution.ts",

    "importNameCodeFixNewImportNodeModules0.ts",

    "importNameCodeFixNewImportNodeModules1.ts",

    "importNameCodeFixNewImportNodeModules2.ts",

    "importNameCodeFixNewImportNodeModules3.ts",

    "importNameCodeFixNewImportNodeModules4.ts",

    "importNameCodeFixNewImportNodeModules5.ts",

    "importNameCodeFixNewImportNodeModules6.ts",

    "importNameCodeFixNewImportNodeModules7.ts",

    "importNameCodeFixNewImportNodeModules8.ts",

    "importNameCodeFix_avoidRelativeNodeModules.ts",

    "importNameCodeFix_getCanonicalFileName.ts",

    "importNameCodeFix_symlink.ts",

    "importNameCodeFix_symlink_own_package.ts",

    "importNameCodeFix_symlink_own_package_2.ts",

    "importNameCodeFix_types_classic.ts",

    "importNameCodeFixOptionalImport1.ts",

    "importNameCodeFixUMDGlobalReact0.ts",

    "importNameCodeFixUMDGlobalReact1.ts",

    "importTypesDeclarationDiagnosticsNoServerError.ts",

    "moduleReexportedIntoGlobalQuickInfo.ts",

    "noImportCompletionsInOtherJavaScriptFile.ts"

];



const compilerCasesNameArray = [

    "declarationEmitForGlobalishSpecifierSymlink.ts",

    "declarationEmitForGlobalishSpecifierSymlink2.ts",

    "declarationEmitHasTypesRefOnNamespaceUse.ts",

    "declarationEmitReexportedSymlinkReference.ts",

    "declarationEmitReexportedSymlinkReference2.ts",

    "declarationEmitReexportedSymlinkReference3.ts",

    "declarationEmitSymlinkPaths.ts",

    "declarationEmitUnnessesaryTypeReferenceNotAdded.ts",

    "declarationEmitWithInvalidPackageJsonTypings.ts",

    "duplicatePackage_globalMerge.ts",

    "duplicatePackage.ts",

    "duplicatePackage_packageIdIncludesSubModule.ts",

    "duplicatePackage_referenceTypes.ts",

    "duplicatePackage_relativeImportWithinPackage.ts",

    "duplicatePackage_relativeImportWithinPackage_scoped.ts",

    "duplicatePackage_subModule.ts",

    "duplicatePackage_withErrors.ts",

    "moduleLocalImportNotIncorrectlyRedirected.ts",

    "moduleResolutionPackageIdWithRelativeAndAbsolutePath.ts",

    "moduleResolutionWithExtensions_unexpected.ts",

    "moduleResolutionWithExtensions_unexpected2.ts",

    "moduleResolution_packageJson_notAtPackageRoot.ts",

    "moduleResolution_packageJson_notAtPackageRoot_fakeScopedPackage.ts",

    "moduleResolution_packageJson_scopedPackage.ts",

    "moduleResolution_packageJson_yesAtPackageRoot.ts",

    "moduleResolution_packageJson_yesAtPackageRoot_fakeScopedPackage.ts",

    "moduleResolution_packageJson_yesAtPackageRoot_mainFieldInSubDirectory.ts",

    "symbolLinkDeclarationEmitModuleNamesImportRef.ts"

];



const thisFilePath = __dirname;

function GenOHFourslashTestCases() {

    const ohFourslashCasesDir = path.join(thisFilePath, "../tests/cases/fourslash/oh");

    if (!fs.existsSync(ohFourslashCasesDir)) {

        fs.mkdirSync(ohFourslashCasesDir);

    }

    for (const caseName of fourslashCasesNameArray) {

        const fourslashCasesNamePath = path.join(thisFilePath, "../tests/cases/fourslash", caseName);



        const ohFourslashCasesName = caseName.replace(/NodeModules/g, "OHModules").replace(/PackageJson/g, "OHPackageJson5");

        const ohFourslashCasesNamePath = path.join(ohFourslashCasesDir, ohFourslashCasesName);



        const fileContent = fs.readFileSync(fourslashCasesNamePath).toString();

        let ohfileContent = fileContent.replace(/node_modules/g, "oh_modules").replace(/package.json/g, "oh-package.json5");

        if (caseName === "completionForStringLiteralNonrelativeImport7.ts" || caseName === "completionForStringLiteralNonrelativeImport11.ts") {

            ohfileContent = ohfileContent.replace("fourslash/modules", "fourslash/oh/modules")

        }

        fs.writeFileSync(ohFourslashCasesNamePath, ohfileContent);

    }

}



function GenOHCompilerTestCases() {

    const ohCompilerCasesDir = path.join(thisFilePath, "../tests/cases/compiler-oh");

    const baselineDir = path.join(thisFilePath, "../tests/baselines/reference");

    const baselineTypes = [".js", ".symbols", ".types", ".errors.txt", ".trace.json"];

    if (!fs.existsSync(ohCompilerCasesDir)) {

        fs.mkdirSync(ohCompilerCasesDir);

    }



    for (const caseName of compilerCasesNameArray) {

        const compilerCasesNamePath = path.join(thisFilePath, "../tests/cases/compiler", caseName);

        let ohCompilerCasesName = "";

        if (RegExp(/NodeModules|PackageJson/g).test(caseName)) {

            ohCompilerCasesName = caseName.replace(/NodeModules/g, "OHModules").replace(/PackageJson/g, "OHPackageJson5");

        }

        else {

            ohCompilerCasesName = caseName.replace(".ts", "_isohpm.ts");

        }

        const ohCompilerCasesNamePath = path.join(ohCompilerCasesDir, ohCompilerCasesName);

        const fileContent = fs.readFileSync(compilerCasesNamePath).toString();

        let ohfileContent = "";

        if (fileContent.startsWith("// @filename")) {

            ohfileContent = "// @packageManagerType: ohpm\r\n" + fileContent.replace(/node_modules/g, "oh_modules").replace(/package.json/g, "oh-package.json5");

        } else {

            ohfileContent = "// @packageManagerType: ohpm\n" + fileContent.replace(/node_modules/g, "oh_modules").replace(/package.json/g, "oh-package.json5");

        }

        fs.writeFileSync(ohCompilerCasesNamePath, ohfileContent);



        const baselineCaseNamePath = path.join(baselineDir, caseName);

        for (const type of baselineTypes) {

            const baselineNamePath = baselineCaseNamePath.replace(".ts", type);

            if (!fs.existsSync(baselineNamePath)) {

                continue;

            }

            const content = fs.readFileSync(baselineNamePath).toString();

            let ohContent = content.replace(/node_modules/g, "oh_modules").replace(/package.json/g, "oh-package.json5").replace(caseName, ohCompilerCasesName);

            if (type == ".js") {

                ohContent = ohContent.replace("tests/cases/compiler", "tests/cases/compiler-oh");

            }

            const ohBaselineNamePath = path.join(baselineDir, ohCompilerCasesName).replace(".ts", type);

            fs.writeFileSync(ohBaselineNamePath, ohContent);

        }

    }

}



function main() {

    GenOHFourslashTestCases();

    GenOHCompilerTestCases();

}



main()