"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CocoaPodsPlatformManager = void 0;
const os_1 = require("os");
const path = require("path");
const semver = require("semver");
const _ = require("lodash");
const constants_1 = require("../constants");
const yok_1 = require("../common/yok");
class CocoaPodsPlatformManager {
    constructor($logger) {
        this.$logger = $logger;
    }
    addPlatformSection(projectData, podfilePlatformData, projectPodfileContent) {
        const platformSectionData = this.getPlatformSectionData(projectPodfileContent);
        if (platformSectionData && platformSectionData.podfilePlatformData) {
            const shouldReplacePlatformSection = this.shouldReplacePlatformSection(projectData, platformSectionData.podfilePlatformData, podfilePlatformData);
            if (shouldReplacePlatformSection) {
                this.$logger.warn(`Multiple identical platforms with different versions have been detected during the processing of podfiles. The current platform's content "${platformSectionData.podfilePlatformData.content}" from ${platformSectionData.podfilePlatformData.path} will be replaced with "${podfilePlatformData.content}" from ${podfilePlatformData.path}`);
                const newSection = this.buildPlatformSection(podfilePlatformData);
                projectPodfileContent = projectPodfileContent.replace(platformSectionData.platformSectionContent, newSection.trim());
            }
        }
        else {
            projectPodfileContent =
                projectPodfileContent.trim() +
                    os_1.EOL +
                    os_1.EOL +
                    this.buildPlatformSection(podfilePlatformData);
        }
        return projectPodfileContent;
    }
    removePlatformSection(moduleName, projectPodfileContent, podfilePath) {
        const platformSectionData = this.getPlatformSectionData(projectPodfileContent);
        if (platformSectionData &&
            platformSectionData.podfilePlatformData &&
            platformSectionData.podfilePlatformData.path === podfilePath) {
            const podfileContentRegExp = new RegExp(`# Begin Podfile - ([\\s\\S]*?)# End Podfile`, "mg");
            const allPodfiles = projectPodfileContent.match(podfileContentRegExp) || [];
            const selectedPlatformData = this.selectPlatformDataFromProjectPodfile(allPodfiles);
            const newPlatformSection = selectedPlatformData
                ? this.buildPlatformSection(selectedPlatformData)
                : "";
            const regExp = new RegExp(`${platformSectionData.platformSectionContent}\\r?\\n`, "mg");
            projectPodfileContent = projectPodfileContent.replace(regExp, newPlatformSection);
        }
        return projectPodfileContent;
    }
    replacePlatformRow(podfileContent, podfilePath) {
        let podfilePlatformData = null;
        const platformRowRegExp = new RegExp(`^\\s*?(platform\\b\\s*?\\:\\s*?ios\\b(?:,\\s*?['"](.+)['"])?)`, "gm");
        const replacedContent = podfileContent.replace(platformRowRegExp, (substring, firstGroup, secondGroup) => {
            podfilePlatformData = {
                content: firstGroup,
                version: secondGroup,
                path: podfilePath,
            };
            return `# ${substring.trim()}`;
        });
        return { replacedContent, podfilePlatformData };
    }
    getPlatformSectionData(projectPodfileContent) {
        const platformSectionRegExp = new RegExp(`${this.getPlatformSectionHeader()} ([\\s\\S]*?)with[\\s\\S]*?\\n([\\s\\S]*?(?:,\\s*?['"](.+)['"])?)\\n${this.getPlatformSectionFooter()}`, "m");
        const match = platformSectionRegExp.exec(projectPodfileContent);
        let result = null;
        if (match && match[0]) {
            result = {
                platformSectionContent: match[0],
                podfilePlatformData: {
                    path: match[1].trim(),
                    content: match[2],
                    version: match[3],
                },
            };
        }
        return result;
    }
    selectPlatformDataFromProjectPodfile(allPodfiles) {
        const platformRowRegExp = new RegExp(`^\\s*?#\\s*?(platform\\b\\s*?\\:\\s*?ios\\b(?:,\\s*?['"](.+)['"])?)`, "m");
        const podfilePathRegExp = new RegExp(`# Begin Podfile - ([\\s\\S]*?)${os_1.EOL}`);
        let selectedPlatformData = null;
        _.each(allPodfiles, (podfileContent) => {
            const platformMatch = platformRowRegExp.exec(podfileContent);
            const podfilePathMatch = podfilePathRegExp.exec(podfileContent) || [];
            // platform without version -> select it with highest priority
            if (platformMatch && platformMatch[0] && !platformMatch[2]) {
                selectedPlatformData = {
                    version: null,
                    content: platformMatch[1],
                    path: podfilePathMatch[1],
                };
                return false;
            }
            // platform with version
            if (platformMatch && platformMatch[0] && platformMatch[2]) {
                if (!selectedPlatformData ||
                    semver.gt(semver.coerce(platformMatch[2]), semver.coerce(selectedPlatformData.version))) {
                    selectedPlatformData = {
                        version: platformMatch[2],
                        content: platformMatch[1],
                        path: podfilePathMatch[1],
                    };
                }
            }
        });
        return selectedPlatformData;
    }
    shouldReplacePlatformSection(projectData, oldPodfilePlatformData, currentPodfilePlatformData) {
        // The selected platform should be replaced in the following cases:
        // 1. When the pod file is from App_Resources and the selected platform is not from App_Resources
        // 2. When the pod file is from App_Resources, the selected platform is also from App_Resources
        // and the pod's version is greater than the selected one
        // 3. When the pod file doesn't have platform's version -> `platform :ios`
        // 4. When the pod file has a version greater than the selected platform's version
        const appResourcesPodfilePath = path.join(projectData.getAppResourcesDirectoryPath(), "iOS", constants_1.PODFILE_NAME);
        const isFromAppResources = oldPodfilePlatformData.path !== appResourcesPodfilePath &&
            currentPodfilePlatformData.path === appResourcesPodfilePath;
        const isFromAppResourcesWithGreaterPlatformVersion = oldPodfilePlatformData.path === appResourcesPodfilePath &&
            currentPodfilePlatformData.path === appResourcesPodfilePath &&
            semver.gt(semver.coerce(currentPodfilePlatformData.version), semver.coerce(oldPodfilePlatformData.version));
        const isPodfileWithGreaterPlatformVersion = !currentPodfilePlatformData.version ||
            (oldPodfilePlatformData.version &&
                semver.gt(semver.coerce(currentPodfilePlatformData.version), semver.coerce(oldPodfilePlatformData.version)));
        const result = isFromAppResources ||
            isFromAppResourcesWithGreaterPlatformVersion ||
            isPodfileWithGreaterPlatformVersion;
        return result;
    }
    buildPlatformSection(podfilePlatformData) {
        let result = `${this.getPlatformSectionHeader()} ${podfilePlatformData.path} with`;
        if (podfilePlatformData.version) {
            result += ` ${podfilePlatformData.version}`;
        }
        result += `${os_1.EOL}${podfilePlatformData.content}${os_1.EOL}${this.getPlatformSectionFooter()}${os_1.EOL}`;
        return result;
    }
    getPlatformSectionHeader() {
        return "# NativeScriptPlatformSection";
    }
    getPlatformSectionFooter() {
        return "# End NativeScriptPlatformSection";
    }
}
exports.CocoaPodsPlatformManager = CocoaPodsPlatformManager;
yok_1.injector.register("cocoaPodsPlatformManager", CocoaPodsPlatformManager);
//# sourceMappingURL=cocoapods-platform-manager.js.map