from typing import Dict, List
import license_utils
import metadata_dictionary
from license_type import LicenseType


class Metadata:
  def __init__(self, metadata_dict: Dict[str, str | List[str]]):
    self.metadata = metadata_dict

  def get_name(self) -> str:
    return self.metadata["Name"]

  def get_url(self) -> str:
    return self.metadata["URL"]

  def get_version(self):
    if not self._get_version() or self._get_version() in ["0", "unknown",
                                                          "N/A"]:
      # This is a heuristic try to avoid putting a version when the version
      # in the README.chromium does not make any sense.
      return self._get_revision()
    return self._get_version()

  def _get_version_control(self):
    """Returns the VCS of the URL provided if possible,
    otherwise None is returned."""
    if "git" in self.get_url() or "googlesource" in self.get_url():
      return "Git"
    elif "hg" in self.get_url():
      return "Hg"
    return None

  def _create_identifier_block(self) -> metadata_dictionary.MetadataDictionary:
    identifier_dictionary = metadata_dictionary.MetadataDictionary("identifier")
    identifier_dictionary["value"] = f"\"{self.get_url()}\""
    identifier_dictionary["type"] = f"\"{self._get_version_control()}\""
    if self.get_version():
      identifier_dictionary["version"] = f"\"{self.get_version()}\""
    return identifier_dictionary

  def _get_version(self) -> str:
    return self.metadata.get("Version", None)

  def _get_revision(self) -> str:
    return self.metadata.get("Revision", None)

  def get_licenses(self) -> List[str]:
    return self.metadata["License"]

  def get_license_file_path(self) -> str:
    return self.metadata.get("License File", [None])[0]

  def get_license_type(self) -> LicenseType:
    return license_utils.get_most_restrictive_type(self.get_licenses())

  def to_android_metadata(self):
    third_party_dict = metadata_dictionary.MetadataDictionary("third_party")
    third_party_dict["license_type"] = self.get_license_type().name
    if self.get_version():
      third_party_dict["version"] = f"\"{self.get_version()}\""

    if self._get_version_control():
      third_party_dict["identifier_primary"] = self._create_identifier_block()
    else:
      third_party_dict["homepage"] = f"\"{self.get_url()}\""

    return "\n".join(
        [f"name: \"{self.get_name()}\"", f"{third_party_dict}"])
