#!/usr/bin/env python3
"""Tag all three audiobook MP3s with metadata from Audible API."""

import mutagen
from mutagen.mp3 import MP3
from mutagen.id3 import (
    ID3, TIT2, TPE1, TPE2, TALB, TCOM, COMM, TPUB, TDRC, TCON, APIC
)
import os

COVER_DIR = "/media/HDD_1TB/Medien/Audiobooks/covers"

books = [
    {
        "file": "/media/HDD_1TB/Medien/Audiobooks/Schuld_und_Suehne_komplett.mp3",
        "title": "Verbrechen und Strafe",
        "author": "Fjodor Dostojewskij",
        "narrator": "Sylvester Groth",
        "publisher": "Der Audio Verlag",
        "year": "2024",
        "genre": "Klassiker",
        "description": (
            "Russland, 1860. Der verarmte Student Rodion Raskolnikow erschlägt "
            "kaltblütig eine alte Pfandleiherin und deren Schwester. Wucherisch "
            "sei die eine, geistig zurückgeblieben die andere gewesen. Raskolnikow "
            "glaubt, 'lebensunwertes' Leben vernichten zu dürfen. Dazu – der "
            "Notgroschen der Alten ist ihm mehr als willkommen. Als es nicht gelingt, "
            "ihn des Mordes zu überführen, scheint das Verbrechen perfekt. Doch "
            "Raskolnikow hat seine Rechnung ohne jene Regung gemacht, die den "
            "Menschen erst Mensch sein lässt – das eigene Gewissen. Voller "
            "Schuldgefühle fällt er in ein tiefes Delirium, an dessen Ende nur "
            "eines steht: der Wunsch, das eigene Verbrechen zu büßen. "
            "Der Klassiker Schuld und Sühne – neu übersetzt von Swetlana Geier."
        ),
        "cover": os.path.join(COVER_DIR, "Verbrechen_und_Strafe.jpg"),
    },
    {
        "file": "/media/HDD_1TB/Medien/Audiobooks/Karl_Marx_und_der_Fluch_des_Geldes_komplett.mp3",
        "title": "Karl Marx und der Fluch des Geldes",
        "author": "Hans-Christoph Liess",
        "narrator": "Peter Kaempfe, Rasmus Meyer-Loos, Svenja Pages, Erkki Hopf, Anne Moll, Sina Gussek",
        "publisher": "Audiolino OHG",
        "year": "2018",
        "genre": "Biografie",
        "description": (
            "Als einer der bekanntesten und umstrittensten Ökonomen aller Zeiten "
            "erkannte und beschrieb Karl Marx als Erster, wie das kapitalistische "
            "Wirtschaftssystem funktioniert. Er prophezeite, dass dieses System "
            "zu einer immer extremeren Kluft zwischen Arm und Reich führen würde. "
            "Er sagte die Globalisierung und die Fusionen großer Unternehmen voraus. "
            "Wer war also dieser bürgerliche Gelehrte und welche Ideen entwickelte er? "
            "Friedrich Engels, seine Frau Jenny und andere Weggefährten erzählen "
            "anschaulich aus ihrem Leben mit Marx. Szenische Lesung mit vielen "
            "Sprechern und Musik."
        ),
        "cover": os.path.join(COVER_DIR, "Karl_Marx_Fluch_des_Geldes.jpg"),
    },
    {
        "file": "/media/HDD_1TB/Medien/Audiobooks/Maksym_komplett.mp3",
        "title": "Maksym",
        "author": "Dirk Stermann",
        "narrator": "Dirk Stermann",
        "publisher": "Lübbe Audio",
        "year": "2022",
        "genre": "Zeitgenössische Literatur, Satire",
        "description": (
            "Die Frau ist für gewisse Zeit beruflich im Ausland, und nun hat Dirk "
            "ärgerlicherweise neben der eigentlichen auch die Familienarbeit an der "
            "Hacke, konkret: den gemeinsamen Sohn Hermann. Die Doppelbelastung ist "
            "auf Dauer nicht zu leisten, ein Babysitter muss her. Freunde hatten, "
            "sehr modern, einen männlichen, der Mann war Ukrainer, sehr freundlich "
            "und auch gebildet, immer ein Zitat von Joseph Roth auf den Lippen. "
            "Und Dirk entscheidet sich bei der Suche: gegen die ganzen blonden jungen "
            "Frauen und für Maksym, der allerdings nicht so der Typus "
            "Joseph-Roth-Zitierer ist. Erst macht Maksym seine Sache tatsächlich gut, "
            "dann fängt er an, neben dem Sohn auch den Vater zu sitten, und von da "
            "an gibt es nur noch eine Richtung: abwärts."
        ),
        "cover": os.path.join(COVER_DIR, "Maksym.jpg"),
    },
]


def embed_cover(audio, cover_path):
    """Embed cover art into MP3 file."""
    if not os.path.exists(cover_path):
        print(f"  WARNING: Cover not found: {cover_path}")
        return

    with open(cover_path, "rb") as f:
        cover_data = f.read()

    ext = os.path.splitext(cover_path)[1].lower()
    mime_map = {".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".png": "image/png"}
    mime = mime_map.get(ext, "image/jpeg")

    audio.tags.add(
        APIC(
            encoding=3,
            mime=mime,
            type=3,
            desc="Cover",
            data=cover_data,
        )
    )


def tag_book(book):
    """Tag a single audiobook MP3."""
    filepath = book["file"]
    if not os.path.exists(filepath):
        print(f"SKIP (file not found): {filepath}")
        return

    print(f"Tagging: {book['title']}")
    print(f"  File: {os.path.basename(filepath)}")

    try:
        audio = MP3(filepath, ID3=ID3)
    except Exception:
        audio = MP3(filepath)

    if audio.tags is None:
        audio.tags = ID3()

    audio.tags.add(TIT2(encoding=3, text=book["title"]))
    audio.tags.add(TPE1(encoding=3, text=book["author"]))
    audio.tags.add(TPE2(encoding=3, text=book["author"]))
    audio.tags.add(TALB(encoding=3, text=book["title"]))
    audio.tags.add(TCOM(encoding=3, text=book["narrator"]))
    audio.tags.add(COMM(encoding=3, lang="deu", desc="", text=book["description"]))
    audio.tags.add(TPUB(encoding=3, text=book["publisher"]))
    audio.tags.add(TDRC(encoding=3, text=book["year"]))
    audio.tags.add(TCON(encoding=3, text=book["genre"]))
    embed_cover(audio, book["cover"])

    audio.save()
    print(f"  OK: Tags + Cover written.")


def verify_tags(filepath):
    """Print all tags in a file for verification."""
    audio = MP3(filepath)
    if audio.tags is None:
        print("  NO TAGS")
        return

    print(f"\n  Tags in {os.path.basename(filepath)}:")
    for tag in audio.tags.values():
        name = tag.FrameID
        if name == "APIC":
            print(f"    {name}: Cover Image ({len(tag.data)} bytes, {tag.mime})")
        elif name == "COMM":
            text_preview = str(tag.text[0])[:80] if tag.text else "(empty)"
            print(f"    {name}: {text_preview}...")
        else:
            val = str(tag)
            if len(val) > 100:
                val = val[:100] + "..."
            print(f"    {name}: {val}")


if __name__ == "__main__":
    for book in books:
        tag_book(book)

    print("\n" + "=" * 50)
    print("VERIFICATION:")
    for book in books:
        if os.path.exists(book["file"]):
            verify_tags(book["file"])
