/*
 * Copyright 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.tools.build.jetifier.processor.transform.metainf

import com.android.tools.build.jetifier.core.pom.PomDependency
import com.android.tools.build.jetifier.processor.archive.ArchiveFile
import com.android.tools.build.jetifier.processor.transform.TransformationContext
import com.android.tools.build.jetifier.processor.transform.Transformer
import java.nio.file.Paths

/**
 * Transformer for META-INF/(.*).version files.
 *
 * Replaces version files from the META-INF directory. This should be used only for processing
 * of the support library itself.
 */
class MetaInfTransformer internal constructor(
    private val context: TransformationContext
) : Transformer {

    companion object {
        const val META_INF_DIR = "meta-inf"

        const val VERSION_FILE_SUFFIX = ".version"

        val FILES_TO_IGNORE = setOf(
            "androidx.car_car-cluster.version",
            "androidx.car_car-moderator.version",
            "androidx.activity_activity-ktx.version",
            "androidx.lifecycle_lifecycle-runtime-ktx.version",
            "androidx.dynamicanimation_dynamicanimation-ktx.version",
            "androidx.annotation_annotation-experimental.version",
            "androidx.navigation_navigation-testing.version"
        )
    }

    // Does not support single proguard file transformation, file has to be within archive.
    override fun canTransform(file: ArchiveFile): Boolean {
        return context.rewritingSupportLib &&
            file.relativePath.toString().contains(META_INF_DIR, ignoreCase = true) &&
            file.fileName.endsWith(VERSION_FILE_SUFFIX, ignoreCase = true) &&
            !file.isSingleFile
    }

    override fun runTransform(file: ArchiveFile) {
        if (FILES_TO_IGNORE.contains(file.fileName)) {
            return
        }

        val tokens = file.fileName.removeSuffix(VERSION_FILE_SUFFIX).split("_")
        if (tokens.size != 2 || tokens.any { it.isNullOrEmpty() }) {
            return
        }

        val dependency = PomDependency(groupId = tokens[0], artifactId = tokens[1])
        val rule = context.config.pomRewriteRules.firstOrNull { it.matches(dependency) }
        if (rule == null) {
            // This class runs only during de-jetification so we can be strict here
            throw IllegalArgumentException("Unsupported version file '${file.relativePath}'")
        }

        // Replace with new dependencies
        val result = rule.to.rewrite(dependency, context.versions)

        // Update the file content
        file.setNewData(result.version!!.toByteArray())

        // Update the file path
        val dirPath = file.relativePath.toString().removeSuffix(file.fileName)
        val newFileName = result.groupId + "_" + result.artifactId + VERSION_FILE_SUFFIX
        val newPath = Paths.get(dirPath, newFileName)
        file.updateRelativePath(newPath)
    }
}
