import csv

import numpy as np

import os
import webbrowser
from datetime import datetime


class Export:
    def __init__(self) -> None:
        pass

    @staticmethod
    def matrix_to_csv(dateiname: str, liste_spaltenbeschriftung: list, liste_zeilenbeschriftung: list, Matrix: np.matrix | sp.Matrix,
                      beschriftung_kopfzeile: object = "") -> None:
        with open(dateiname, "w", newline="", encoding="utf-8") as csvfile:
            writer = csv.writer(csvfile, delimiter=";")

            kopfzeile = [beschriftung_kopfzeile]
            for spaltenbeschriftung in liste_spaltenbeschriftung:
                kopfzeile.append(str(spaltenbeschriftung))
            writer.writerow(kopfzeile)

            for zeilenbeschriftung, zeile in zip(liste_zeilenbeschriftung, Matrix.tolist()):
                zeile_als_text = [zeilenbeschriftung]
                for eintrag in zeile:
                    try:
                        eintrag_text = str(eintrag).replace(".", ",")
                        try:
                            eintrag_text = float(eintrag_text)
                        except:
                            eintrag_text = eintrag_text
                    except Exception:
                        eintrag_text = str(eintrag)
                    zeile_als_text.append(eintrag_text)
                writer.writerow(zeile_als_text)

    @staticmethod
    def ausgleichung_to_datei(dateiname: str, dict_ausgleichung: dict) -> None:
        with open(dateiname, "w", newline="", encoding="utf-8") as csvfile:
            writer = csv.writer(csvfile, delimiter=";")

            writer.writerow(["Parameter", "Wert"])

            for key, value in dict_ausgleichung.items():

                if hasattr(value, "tolist"):
                    rows = value.rows
                    cols = value.cols

                    writer.writerow([key, f"Matrix {rows}x{cols}"])

                    for i, zeile in enumerate(value.tolist()):
                        zeile_als_text = [f"{key}_zeile_{i+1}"]
                        for eintrag in zeile:
                            try:
                                eintrag_float = float(eintrag)
                                eintrag_text = f"{eintrag_float}".replace(".", ",")
                                try:
                                    eintrag_text = float(eintrag_text)
                                except:
                                    eintrag_text = eintrag_text
                            except Exception:
                                eintrag_text = str(eintrag)
                            zeile_als_text.append(eintrag_text)
                        writer.writerow(zeile_als_text)

                else:
                    try:
                        value_float = float(value)
                        value_text = f"{value_float}".replace(".", ",")
                    except Exception:
                        value_text = str(value)

                    writer.writerow([key, value_text])

    def speichere_html_protokoll(metadaten, ergebnisse):
        # Pfad für den Ordner erstellen
        ordner = "Protokolle"
        if not os.path.exists(ordner):
            os.makedirs(ordner)

        dateiname = f"{ordner}/Protokoll_{metadaten['projekt']}.html"
        abs_path = os.path.abspath(dateiname)

        # HTML Inhalt zusammenbauen
        html_content = f"""
        <!DOCTYPE html>
        <html lang="de">
        <head>
            <meta charset="UTF-8">
            <style>
                body {{ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; margin: 40px; line-height: 1.6; color: #333; }}
                h1 {{ color: #2c3e50; border-bottom: 2px solid #2c3e50; }}
                h3 {{ color: #2980b9; margin-top: 30px; }}
                .metadata {{ background: #f9f9f9; padding: 15px; border-radius: 5px; border-left: 5px solid #2980b9; }}
                table {{ border-collapse: collapse; width: 100%; margin-top: 10px; }}
                th, td {{ text-align: left; padding: 8px; border-bottom: 1px solid #ddd; }}
                tr:nth-child(even) {{ background-color: #f2f2f2; }}
                th {{ background-color: #2980b9; color: white; }}
                .footer {{ margin-top: 50px; font-size: 0.8em; color: #7f8c8d; text-align: center; }}
            </style>
            <title>Netzprotokoll - {metadaten['projekt']}</title>
        </head>
        <body>
            <h1>Netzprotokoll: {metadaten['projekt']}</h1>

            <div class="metadata">
                <p><strong>Bearbeiter:</strong> {metadaten['bearbeiter']}</p>
                <p><strong>Datum:</strong> {metadaten['datum']}</p>
                <p><strong>Ausgleichungsmodus:</strong> Methode der kleinsten Quadrate (L2-Norm)</p>
            </div>

            <h3>1. Globaltest</h3>
            {ergebnisse['df_globaltest'].to_html(index=False)}

            <h3>2. Redundanzanteile</h3>
            {ergebnisse['df_redundanz'].to_html(index=False)}

            <h3>3. Standardellipsen</h3>
            {ergebnisse['df_ellipsen'].to_html(index=False)}

            <h3>3. Konfidenzellipsen</h3>
            {ergebnisse['df_konfidenzellipsen'].to_html(index=False)}
            
            <h3>3. Koordinaten Geozentrisch Kartesisch</h3>
            {ergebnisse['df_koordinaten_geozentrisch_kartesisch'].to_html(index=True)}
            
            <h3>3. Koordinaten UTM</h3>
            {ergebnisse['df_koordinaten_utm'].to_html(index=True)}

            <div class="footer">
                Erstellt automatisch am {datetime.now().strftime('%d.%m.%Y um %H:%M:%S')}
            </div>
        </body>
        </html>
        """

        # Datei schreiben
        with open(dateiname, "w", encoding="utf-8") as f:
            f.write(html_content)

        print(f"✅ Protokoll wurde gespeichert unter: {abs_path}")

        # Datei automatisch im Standard-Browser öffnen
        webbrowser.open(f"file://{abs_path}")