#!/usr/bin/env python
# -*- coding: utf-8 -*-

from app import app, initialize_database, db_path
from models import db, User, Thought, Comment, MindMapNode, ThoughtRelation, ThoughtRating, RelationType
from models import Category, UserMindmap, UserMindmapNode, MindmapNote
import os

def init_database():
    """Initialisiert die Datenbank mit Beispieldaten."""
    with app.app_context():
        # Datenbank löschen und neu erstellen
        if os.path.exists(db_path):
            os.remove(db_path)
        
        # Stellen Sie sicher, dass das Verzeichnis existiert
        os.makedirs(os.path.dirname(db_path), exist_ok=True)
        
        db.create_all()
        
        # Admin-Benutzer erstellen
        admin = User(username='admin', email='admin@example.com', is_admin=True)
        admin.set_password('admin')
        db.session.add(admin)
        
        # Beispiel-Benutzer erstellen
        user = User(username='user', email='user@example.com')
        user.set_password('user')
        db.session.add(user)
        
        # Commit, um IDs zu generieren
        db.session.commit()
        
        # Wissenschaftliche Kategorien erstellen
        science = Category(name='Wissenschaft', description='Wissenschaftliche Erkenntnisse', 
                          color_code='#4CAF50', icon='flask')
        db.session.add(science)
        
        philosophy = Category(name='Philosophie', description='Philosophische Theorien und Gedanken', 
                             color_code='#9C27B0', icon='lightbulb')
        db.session.add(philosophy)
        
        technology = Category(name='Technologie', description='Technologische Entwicklungen', 
                             color_code='#FF9800', icon='microchip')
        db.session.add(technology)
        
        db.session.commit()
        
        # Wissenschaftliche Unterkategorien
        physics = Category(name='Physik', description='Studium der Materie und Energie',
                          color_code='#81C784', icon='atom', parent_id=science.id)
        biology = Category(name='Biologie', description='Studium lebender Organismen',
                          color_code='#66BB6A', icon='leaf', parent_id=science.id)
        chemistry = Category(name='Chemie', description='Studium der Stoffe und ihrer Reaktionen',
                            color_code='#A5D6A7', icon='vial', parent_id=science.id)
        
        db.session.add_all([physics, biology, chemistry])
        
        # Technologie-Unterkategorien
        informatics = Category(name='Informatik', description='Studium der Informationsverarbeitung',
                              color_code='#FFB74D', icon='laptop-code', parent_id=technology.id)
        ai = Category(name='Künstliche Intelligenz', description='Entwicklung intelligenter Systeme',
                     color_code='#FFA726', icon='robot', parent_id=technology.id)
        
        db.session.add_all([informatics, ai])
        
        # Philosophie-Unterkategorien
        ethics = Category(name='Ethik', description='Moralphilosophie und Wertesysteme',
                         color_code='#BA68C8', icon='balance-scale', parent_id=philosophy.id)
        logic = Category(name='Logik', description='Studie der gültigen Schlussfolgerungen',
                        color_code='#AB47BC', icon='project-diagram', parent_id=philosophy.id)
        
        db.session.add_all([ethics, logic])
        
        db.session.commit()
        
        # Knoten für die öffentliche Mindmap erstellen
        nodes = {
            'quantenmechanik': MindMapNode(
                name='Quantenmechanik',
                description='Physikalische Theorie zur Beschreibung der Materie auf atomarer Ebene',
                color_code='#81C784',
                category_id=physics.id,
                created_by_id=admin.id
            ),
            'relativitaetstheorie': MindMapNode(
                name='Relativitätstheorie',
                description='Einsteins Theorien zur Raumzeit und Gravitation',
                color_code='#81C784',
                category_id=physics.id,
                created_by_id=admin.id
            ),
            'genetik': MindMapNode(
                name='Genetik',
                description='Wissenschaft der Gene und Vererbung',
                color_code='#66BB6A',
                category_id=biology.id,
                created_by_id=admin.id
            ),
            'machine_learning': MindMapNode(
                name='Machine Learning',
                description='Algorithmen, die aus Daten lernen können',
                color_code='#FFA726',
                category_id=ai.id,
                created_by_id=admin.id
            ),
            'ki_ethik': MindMapNode(
                name='KI-Ethik',
                description='Moralische Implikationen künstlicher Intelligenz',
                color_code='#BA68C8',
                category_id=ethics.id,
                created_by_id=user.id
            )
        }
        
        for node in nodes.values():
            db.session.add(node)
        
        db.session.commit()
        
        # Verknüpfungen zwischen Knoten herstellen (Hierarchie)
        nodes['machine_learning'].parents.append(nodes['ki_ethik'])
        db.session.commit()
        
        # Gedanken erstellen
        thoughts = [
            {
                'title': 'Künstliche Intelligenz und Bewusstsein',
                'content': 'Die Frage nach maschinellem Bewusstsein ist fundamental für die KI-Ethik. Aktuelle KI-Systeme haben kein Bewusstsein, aber fortschrittliche KI könnte in Zukunft Eigenschaften entwickeln, die diesem nahekommen.',
                'abstract': 'Eine Untersuchung der philosophischen Implikationen von KI-Bewusstsein.',
                'keywords': 'KI, Bewusstsein, Ethik, Philosophie',
                'branch': 'Philosophie',
                'color_code': '#BA68C8',
                'source_type': 'Markdown',
                'user_id': user.id,
                'node': nodes['ki_ethik']
            },
            {
                'title': 'Quantenmechanik und Realität',
                'content': 'Die Kopenhagener Deutung und ihre Auswirkungen auf unser Verständnis der Realität. Quantenmechanik stellt grundlegende Annahmen über Determinismus und Lokalität in Frage.',
                'abstract': 'Eine Analyse verschiedener Interpretationen der Quantenmechanik.',
                'keywords': 'Quantenmechanik, Physik, Realität',
                'branch': 'Physik',
                'color_code': '#81C784',
                'source_type': 'PDF',
                'user_id': admin.id,
                'node': nodes['quantenmechanik']
            },
            {
                'title': 'Deep Learning Fortschritte',
                'content': 'Die neuesten Fortschritte im Deep Learning haben zu beeindruckenden Ergebnissen in Bereichen wie Computer Vision, Natural Language Processing und Reinforcement Learning geführt.',
                'abstract': 'Überblick über aktuelle Deep Learning-Techniken und ihre Anwendungen.',
                'keywords': 'Deep Learning, Neural Networks, AI',
                'branch': 'Technologie',
                'color_code': '#FFA726',
                'source_type': 'Webpage',
                'user_id': admin.id,
                'node': nodes['machine_learning']
            }
        ]
        
        thought_objects = []
        for t_data in thoughts:
            node = t_data.pop('node')
            thought = Thought(**t_data)
            node.thoughts.append(thought)
            thought_objects.append(thought)
            db.session.add(thought)
        
        db.session.commit()
        
        # Beziehungen zwischen Gedanken
        relation = ThoughtRelation(
            source_id=thought_objects[0].id,
            target_id=thought_objects[2].id,
            relation_type=RelationType.INSPIRES,
            created_by_id=user.id
        )
        db.session.add(relation)
        
        # Bewertungen erstellen
        rating1 = ThoughtRating(
            thought_id=thought_objects[0].id,
            user_id=admin.id,
            relevance_score=5
        )
        rating2 = ThoughtRating(
            thought_id=thought_objects[2].id,
            user_id=user.id,
            relevance_score=4
        )
        db.session.add_all([rating1, rating2])
        
        # Kommentare erstellen
        for thought in thought_objects:
            comment = Comment(
                content=f'Interessante Perspektive zu {thought.title}!',
                thought_id=thought.id,
                user_id=admin.id if thought.user_id != admin.id else user.id
            )
            db.session.add(comment)
        
        # Benutzer-Mindmaps erstellen
        user_mindmap = UserMindmap(
            name='Meine KI-Forschung',
            description='Meine persönliche Sammlung zu KI und Ethik',
            user_id=user.id
        )
        db.session.add(user_mindmap)
        db.session.commit()
        
        # Knoten zur Benutzer-Mindmap hinzufügen
        user_mindmap_nodes = [
            UserMindmapNode(
                user_mindmap_id=user_mindmap.id,
                node_id=nodes['machine_learning'].id,
                x_position=200,
                y_position=300
            ),
            UserMindmapNode(
                user_mindmap_id=user_mindmap.id,
                node_id=nodes['ki_ethik'].id,
                x_position=500,
                y_position=200
            )
        ]
        db.session.add_all(user_mindmap_nodes)
        
        # Private Notizen
        note = MindmapNote(
            user_id=user.id,
            mindmap_id=user_mindmap.id,
            node_id=nodes['ki_ethik'].id,
            content="Recherchiere mehr über aktuelle ethische Richtlinien für KI-Entwicklung!",
            color_code="#FFF59D"
        )
        db.session.add(note)
        
        # Gedanken zu Bookmarks hinzufügen
        user.bookmarked_thoughts.append(thought_objects[0])
        admin.bookmarked_thoughts.append(thought_objects[1])
        
        # Finaler Commit
        db.session.commit()
        
        print("Datenbank wurde erfolgreich initialisiert!")

def init_db():
    """Alias für Kompatibilität mit älteren Scripts."""
    init_database()

if __name__ == '__main__':
    init_database()
    print("Datenbank wurde erfolgreich initialisiert!")
    print("Sie können die Anwendung jetzt mit 'python app.py' starten")
    print("Anmelden mit:")
    print("  Admin: username=admin, password=admin")
    print("  User:  username=user, password=user") 