# Copyright 2016 Anthony Bradley.  All rights reserved.
#
# This file is part of the Biopython distribution and governed by your
# choice of the "Biopython License Agreement" or the "BSD 3-Clause License".
# Please see the LICENSE file that should have been included as part of this
# package.
"""Support for loading 3D structures stored in MMTF files (DEPRECATED).

RCSB PDB decommissioned the MMTF file format in July 2024 and switched off
its download server, so MMTF files can no longer be downloaded. This module
is deprecated and will be removed in a future release of BioPAIthon. Please
use BinaryCIF files with ``Bio.PDB.binary_cif``, or mmCIF files with
``Bio.PDB.MMCIFParser``, instead.
"""

import warnings

from Bio import BiopythonDeprecationWarning

try:
    from mmtf import fetch
    from mmtf import parse
except ImportError:
    from Bio import MissingPythonDependencyError

    raise MissingPythonDependencyError(
        "Install mmtf to use Bio.PDB.mmtf (e.g. pip install mmtf-python)"
    ) from None
from Bio.PDB.mmtf.DefaultParser import StructureDecoder

from .mmtfio import MMTFIO

warnings.warn(
    "Bio.PDB.mmtf has been deprecated, and we intend to remove it in a "
    "future release of BioPAIthon. RCSB decommissioned the MMTF file format "
    "in July 2024 and switched off its download server, so MMTF files can "
    "no longer be downloaded. As an alternative, please use BinaryCIF files "
    "with Bio.PDB.binary_cif, or mmCIF files with Bio.PDB.MMCIFParser.",
    BiopythonDeprecationWarning,
)


def get_from_decoded(decoder):
    """Return structure from decoder."""
    structure_decoder = StructureDecoder()
    decoder.pass_data_on(structure_decoder)
    return structure_decoder.structure_builder.get_structure()


class MMTFParser:
    """Class to get a Biopython structure from a URL or a filename."""

    @staticmethod
    def get_structure_from_url(pdb_id):
        """Get a structure from a URL - given a PDB id.

        :param pdb_id: the input PDB id
        :return: the structure

        """
        decoder = fetch(pdb_id)
        return get_from_decoded(decoder)

    @staticmethod
    def get_structure(file_path):
        """Get a structure from a file - given a file path.

        :param file_path: the input file path
        :return: the structure

        """
        decoder = parse(file_path)
        return get_from_decoded(decoder)
