#!/usr/bin/env python3

# ########################################################
# SKRIPT: ISBN_KBART_Vergleich
# ZWECK: Vergleicht zwei CSV-Dateien und speichert Ergebnisse in KBART File
# ########################################################

# VERWENDUNG:
#    python3 ISBN_KBART_vergleich.py datei1.csv datei2.csv
# ARGUMENTE:
#		datei1.csv: Die erste CSV-Datei, deren Daten verglichen werden sollen. (ISBN Liste aus K10Plus)
#		datei2.csv: Die zweite CSV-Datei, die für den Vergleich verwendet wird. (Verlag KBART File)
# Bitte kehren Sie die Reihenfolge der Dateien nicht um, sonst funktioniert das Skript nicht.
# Beispiel für eine Datei, in der die dritte Spalte ISBNs enthält und als Trennzeichen den Tabulator hat:
# PPN	EPN	ISBN_2000
# 1664581936	3731879522	978-3-446-45992-2
# 1665343974	3514510717	978-3-446-46093-5
#
# BESCHREIBUNG:
#    1. Liest zwei CSV-Dateien ein.
#    2. Vergleicht die dritte Spalte* jeder Zeile. 
#    3. Speichert übereinstimmende Zeilen in 'kbart_for_gokb.txt'.
# *Falls die ISBN in anderen Spalten vorhanden ist, muss der Code geändert werden. Siehe Zeile 80
#
# HINWEIS: Dateinamen gemäß NISO-Richtlinien für Paketnamen ändern.
# Paketnamensrichtlinien für GOKb fordern eindeutige, unterscheidbare Namen. 
# Der Name soll enthalten: Kurzform des Plattform-Anbieters (falls nicht offensichtlich), vom Anbieter vergebener Paketname,
# ggf. geografische oder Konsortial-Einschränkungen und Bezugsjahr bei nicht fortlaufenden Paketen
# Beispiel: hanser_global_elektrotechnik_2019_2024-04-19.txt
# Für mehr Informationen: https://gokb.org/de/documentation/guidelines-for-package-names.html

import csv
import sys

def lese_csv_datei(dateiname):
    # ZWECK: Öffnet und liest eine CSV-Datei
    # 
    # VORGEHEN:
    # 1. Öffnet die angegebene Datei
    # 2. Bestimmt das Trennzeichen automatisch
    # 3. Liest alle Zeilen
    # 4. Behandelt Semikolons in der dritten Spalte
    # 
    # RÜCKGABE: Liste von Zeilen aus der CSV-Datei
    try:
        # Datei öffnen und Inhalt lesen
        with open(dateiname, newline='', encoding='utf-8') as csv_datei:
            # Trennzeichen automatisch erkennen
            sniff = csv.Sniffer()
            trennzeichen = sniff.sniff(csv_datei.read()).delimiter
            csv_datei.seek(0)  # Zurück zum Dateianfang
            
            daten = []
            csv_leser = csv.reader(csv_datei, delimiter=trennzeichen)
            for zeile in csv_leser:
                # BEHANDLUNG: Semikolon in der dritten Spalte
                if ";" in zeile[2]:
                    zeile[2] = zeile[2].split(";")[0].strip()
                daten.append(zeile)
        return daten
    except FileNotFoundError:
        print(f"FEHLER: Datei '{dateiname}' nicht gefunden.")
        sys.exit(1)
    except Exception as e:
        print(f"FEHLER beim Lesen der Datei '{dateiname}': {e}")
        sys.exit(1)

def vergleiche_spalten(liste1, isbn):
    # ZWECK: Vergleicht Daten aus zwei Listen
    # 
    # VORGEHEN:
    # 1. Durchläuft jede Zeile der ersten Liste
    # 2. Vergleicht den Wert in der dritten Spalte mit der zweiten Liste
    # 3. Bei Übereinstimmung: Formatiert und speichert die Zeile
    # 
    # RÜCKGABE: Liste der übereinstimmenden, formatierten Zeilen
    ergebnisse = []
    for zeile_liste1 in liste1:
        for zeile_isbn in isbn:
            if zeile_liste1[2] == zeile_isbn[2]:  # Vergleich der dritten Spalten
                ergebnis_formatiert = "\t".join(zeile_isbn)  # Formatierung mit Tabulatoren
                ergebnisse.append(ergebnis_formatiert)
                break  # Beendet innere Schleife nach Treffer
    return ergebnisse

# #####################################
# HAUPTTEIL DES SKRIPTS
# #####################################

if __name__ == "__main__":
    # Überprüfung der Argumente
    if len(sys.argv) != 3:
        print("FEHLER: Bitte geben Sie zwei Dateinamen als Argumente an.")
        sys.exit(1)
    
    # Einlesen der Dateinamen
    datei_liste1 = sys.argv[1]
    datei_isbn = sys.argv[2]
    
    # SCHRITT 1: Daten aus CSV-Dateien lesen
    liste1 = lese_csv_datei(datei_liste1)
    isbn = lese_csv_datei(datei_isbn)
    
    # SCHRITT 2: Spalten vergleichen und Ergebnisse erhalten
    ergebnisse = vergleiche_spalten(liste1, isbn)
    
    # SCHRITT 3: Ergebnisse in Datei speichern
    with open('kbart_for_gokb.txt', 'w', encoding='utf-8') as ausgabedatei:
        # Spaltenüberschriften schreiben
        header_isbn = "publication_title\tprint_identifier\tonline_identifier\tdate_first_issue_online\tnum_first_vol_online\tnum_first_issue_online\tdate_last_issue_online\tnum_last_vol_online\tnum_last_issue_online\ttitle_url\tfirst_author\ttitle_id\tembargo_info\tcoverage_depth\tcoverage_notes\tpublisher_name\tpublication_type\tdate_monograph_published_print\tdate_monograph_published_online\tmonograph_volume\tmonograph_edition\tfirst_editor\tparent_publication_title_id\tpreceding_publication_title_id\taccess_type"
        ausgabedatei.write(header_isbn + '\n')
        
        # Ergebnisse in 'kbart_for_gokb.txt' schreiben
        for zeile in ergebnisse:
            ausgabedatei.write(zeile + '\n')
    
    print("FERTIG: Ergebnisse in 'kbart_for_gokb.txt' gespeichert.")
    print("WICHTIG: Dateinamen gemäß NISO-Richtlinien für Paketnamen ändern.")
