#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Script de restauration des données du site GMPL.
Permet d'importer les données d'un fichier JSON vers la base de données
après une modification de structure ou une réinitialisation.
"""

import json
import os
from datetime import datetime
from werkzeug.security import generate_password_hash
from app import create_app, db
from models import User, Product, Category, Service, Contact, FAQ, SiteSetting, Page, Section

# Créer l'application avec le contexte
app = create_app()

def restore_data(input_file):
    """Restaure les données à partir d'un fichier JSON de sauvegarde"""
    
    if not os.path.exists(input_file):
        print(f"Erreur : Le fichier '{input_file}' n'existe pas.")
        return False
    
    # Charger les données de sauvegarde
    with open(input_file, 'r', encoding='utf-8') as f:
        backup = json.load(f)
    
    with app.app_context():
        try:
            # Restauration des paramètres du site
            print("Restauration des paramètres du site...")
            for setting_data in backup.get('settings', []):
                existing_setting = SiteSetting.query.filter_by(key=setting_data['key']).first()
                if existing_setting:
                    existing_setting.value = setting_data['value']
                    existing_setting.description = setting_data['description']
                else:
                    setting = SiteSetting(
                        key=setting_data['key'],
                        value=setting_data['value'],
                        description=setting_data['description']
                    )
                    db.session.add(setting)
            db.session.commit()
            
            # Restauration des catégories (d'abord les parents puis les enfants)
            print("Restauration des catégories...")
            # Première passe: catégories sans parent
            for cat_data in [c for c in backup.get('categories', []) if not c.get('parent_id')]:
                existing_cat = Category.query.filter_by(name=cat_data['name']).first()
                if existing_cat:
                    existing_cat.description = cat_data['description']
                else:
                    category = Category(
                        name=cat_data['name'],
                        description=cat_data['description']
                    )
                    db.session.add(category)
            db.session.commit()
            
            # Deuxième passe: catégories avec parent
            for cat_data in [c for c in backup.get('categories', []) if c.get('parent_id')]:
                existing_cat = Category.query.filter_by(name=cat_data['name']).first()
                if existing_cat:
                    existing_cat.description = cat_data['description']
                    existing_cat.parent_id = cat_data['parent_id']
                else:
                    category = Category(
                        name=cat_data['name'],
                        description=cat_data['description'],
                        parent_id=cat_data['parent_id']
                    )
                    db.session.add(category)
            db.session.commit()
            
            # Restauration des produits
            print("Restauration des produits...")
            for prod_data in backup.get('products', []):
                existing_prod = Product.query.filter_by(name=prod_data['name']).first()
                if existing_prod:
                    existing_prod.description = prod_data['description']
                    existing_prod.price = prod_data['price']
                    existing_prod.category_id = prod_data['category_id']
                    existing_prod.is_available = prod_data['is_available']
                    existing_prod.condition = prod_data['condition']
                    existing_prod.image_url = prod_data['image_url']
                else:
                    product = Product(
                        name=prod_data['name'],
                        description=prod_data['description'],
                        price=prod_data['price'],
                        image_url=prod_data['image_url'],
                        category_id=prod_data['category_id'],
                        is_available=prod_data['is_available'],
                        condition=prod_data['condition']
                    )
                    db.session.add(product)
            db.session.commit()
            
            # Restauration des services
            print("Restauration des services...")
            for service_data in backup.get('services', []):
                existing_service = Service.query.filter_by(name=service_data['name']).first()
                if existing_service:
                    existing_service.description = service_data['description']
                    existing_service.image_url = service_data['image_url']
                    existing_service.is_active = service_data['is_active']
                else:
                    service = Service(
                        name=service_data['name'],
                        description=service_data['description'],
                        image_url=service_data['image_url'],
                        is_active=service_data['is_active']
                    )
                    db.session.add(service)
            db.session.commit()
            
            # Restauration des pages
            print("Restauration des pages...")
            for page_data in backup.get('pages', []):
                existing_page = Page.query.filter_by(slug=page_data['slug']).first()
                if existing_page:
                    existing_page.title = page_data['title']
                    existing_page.description = page_data['description']
                    existing_page.is_active = page_data['is_active']
                    existing_page.meta_keywords = page_data['meta_keywords']
                    existing_page.meta_description = page_data['meta_description']
                else:
                    page = Page(
                        title=page_data['title'],
                        slug=page_data['slug'],
                        description=page_data['description'],
                        is_active=page_data['is_active'],
                        meta_keywords=page_data['meta_keywords'],
                        meta_description=page_data['meta_description']
                    )
                    db.session.add(page)
            db.session.commit()
            
            # Restauration des sections
            print("Restauration des sections...")
            # D'abord supprimer les sections existantes pour éviter les doublons
            for section_data in backup.get('sections', []):
                # Trouver la page associée
                page = Page.query.filter_by(id=section_data['page_id']).first()
                if page:
                    # Créer la section
                    section = Section(
                        page_id=section_data['page_id'],
                        title=section_data['title'],
                        content=section_data['content'],
                        section_type=section_data['section_type'],
                        order=section_data['order'],
                        is_active=section_data['is_active'],
                        background_color=section_data['background_color'],
                        css_class=section_data['css_class'],
                        image_url=section_data['image_url']
                    )
                    db.session.add(section)
            db.session.commit()
            
            # Restauration des utilisateurs (ATTENTION: les mots de passe sont réinitialisés)
            print("Restauration des utilisateurs...")
            for user_data in backup.get('users', []):
                existing_user = User.query.filter_by(username=user_data['username']).first()
                if existing_user:
                    existing_user.email = user_data['email']
                    existing_user.role = user_data['role']
                else:
                    # Mot de passe temporaire pour les utilisateurs restaurés
                    temp_password = "gmpl2023"
                    user = User(
                        username=user_data['username'],
                        email=user_data['email'],
                        password_hash=generate_password_hash(temp_password),
                        role=user_data['role']
                    )
                    db.session.add(user)
            db.session.commit()
            
            # Restauration des messages de contact (optionnel)
            print("Restauration des messages de contact...")
            for contact_data in backup.get('contacts', []):
                existing_contact = Contact.query.filter_by(email=contact_data['email'], 
                                                         message=contact_data['message']).first()
                if not existing_contact:
                    contact = Contact(
                        name=contact_data['name'],
                        email=contact_data['email'],
                        phone=contact_data['phone'],
                        message=contact_data['message'],
                        is_read=contact_data['is_read']
                    )
                    db.session.add(contact)
            db.session.commit()
            
            # Restauration des FAQs
            print("Restauration des FAQs...")
            for faq_data in backup.get('faqs', []):
                existing_faq = FAQ.query.filter_by(question=faq_data['question']).first()
                if existing_faq:
                    existing_faq.answer = faq_data['answer']
                    existing_faq.order = faq_data['order']
                    existing_faq.is_active = faq_data['is_active']
                else:
                    faq = FAQ(
                        question=faq_data['question'],
                        answer=faq_data['answer'],
                        order=faq_data['order'],
                        is_active=faq_data['is_active']
                    )
                    db.session.add(faq)
            db.session.commit()
            
            print("Restauration des données terminée avec succès.")
            return True
            
        except Exception as e:
            db.session.rollback()
            print(f"Erreur lors de la restauration des données : {str(e)}")
            return False

if __name__ == "__main__":
    print("Script de restauration des données du site GMPL")
    print("-------------------------------------------")
    
    # Demander le chemin du fichier de sauvegarde
    input_file = input("Chemin vers le fichier de sauvegarde : ")
    
    if not input_file:
        print("Aucun fichier spécifié. Restauration annulée.")
    else:
        print("ATTENTION : La restauration des données va écraser les données existantes.")
        print("Les mots de passe de tous les utilisateurs seront réinitialisés à 'gmpl2023'.")
        confirm = input("Êtes-vous sûr de vouloir continuer ? (oui/non) : ")
        
        if confirm.lower() in ["oui", "o", "yes", "y"]:
            success = restore_data(input_file)
            if success:
                print("Restauration terminée avec succès.")
                print("N'oubliez pas que les mots de passe des utilisateurs ont été réinitialisés à 'gmpl2023'.")
            else:
                print("La restauration a échoué. Vérifiez le fichier de sauvegarde et réessayez.")
        else:
            print("Restauration annulée.")