#!/usr/bin/env python3
"""
Chapter 10: Python for Next Gen Biologist
Script: ch10_biopython_toolkit.py
Description: Biopython core workflows: Seq and SeqRecord objects, FASTA parsing,
             simulated NCBI Entrez E-Utilities fetching, and BLAST output parsing.
Usage:
    python ch10_biopython_toolkit.py
"""

import sys
import io

def demo_biopython_seq():
    """Demonstrates Seq object features with native fallback if biopython is not installed."""
    try:
        from Bio.Seq import Seq
        from Bio.SeqRecord import SeqRecord
        
        my_seq = Seq("ATGCGATCGATCGATCGATAGCTAGCTA")
        record = SeqRecord(my_seq, id="NC_000913.3", description="E. coli K-12 complete genome fragment")
        
        print("=== Biopython Seq & SeqRecord Demo ===")
        print(f"Record ID    : {record.id}")
        print(f"Description  : {record.description}")
        print(f"Sequence (bp): {len(record.seq)}")
        print(f"Transcription: {record.seq.transcribe()[:20]}...")
        print(f"Translation  : {record.seq.translate()}")
        return True
    except ImportError:
        print("[NOTICE] 'biopython' is not installed in the current environment.")
        print("Run: pip install biopython")
        print("\nDemonstrating pure-Python architectural equivalent:")
        raw_dna = "ATGCGATCGATCGATCGATAGCTAGCTA"
        mrna = raw_dna.replace("T", "U")
        print(f"Sequence : {raw_dna}")
        print(f"mRNA     : {mrna}")
        return False

def demo_blast_xml_parsing():
    """Demonstrates parsing NCBI BLAST XML output."""
    xml_data = """<?xml version="1.0"?>
    <BlastOutput>
      <BlastOutput_iterations>
        <Iteration>
          <Iteration_hits>
            <Hit>
              <Hit_num>1</Hit_num>
              <Hit_id>ref|NM_000518.5|</Hit_id>
              <Hit_def>Homo sapiens hemoglobin subunit beta (HBB), mRNA</Hit_def>
              <Hit_len>628</Hit_len>
              <Hit_hsps>
                <Hsp>
                  <Hsp_bit-score>1160.2</Hsp_bit-score>
                  <Hsp_evalue>0.0</Hsp_evalue>
                  <Hsp_identity>628</Hsp_identity>
                </Hsp>
              </Hit_hsps>
            </Hit>
          </Iteration_hits>
        </Iteration>
      </BlastOutput_iterations>
    </BlastOutput>
    """
    print("\n=== BLAST Output Parser Demo ===")
    import xml.etree.ElementTree as ET
    root = ET.fromstring(xml_data.strip())
    hits = root.findall(".//Hit")
    for hit in hits:
        hit_id = hit.find("Hit_id").text
        hit_def = hit.find("Hit_def").text
        eval_elem = hit.find(".//Hsp_evalue")
        evalue = eval_elem.text if eval_elem is not None else "N/A"
        print(f"Top Hit: {hit_id}")
        print(f"Def    : {hit_def}")
        print(f"E-value: {evalue}")

def main():
    has_bio = demo_biopython_seq()
    demo_blast_xml_parsing()

if __name__ == "__main__":
    main()
