from flask import Flask, render_template, redirect, url_for
from config import Config
from models import db, Word, Category, User
from api import api_bp # تأكد من استيرادها بشكل صحيح
from admin import admin_bp # تأكد من استيرادها بشكل صحيح
from flask_login import LoginManager
import os
import sys

# قم بإنشاء كائن Flask الأساسي
app = Flask(__name__)

def create_app(flask_app):
    """
    تهيئة تطبيق Flask.
    هذه الدالة تتلقى كائن Flask وتقوم بتهيئته بالكامل.
    """
    flask_app.config.from_object(Config)

    # طباعة معلومات قاعدة البيانات
    db_type = flask_app.config.get('DB_TYPE', 'sqlite')
    # print(f"Database type: {db_type}")
    # print(f"Database URI: {flask_app.config['SQLALCHEMY_DATABASE_URI']}")

    # تهيئة قاعدة البيانات
    db.init_app(flask_app)

    # تهيئة Flask-Login
    login_manager = LoginManager()
    login_manager.init_app(flask_app)
    login_manager.login_view = 'admin.login'
    login_manager.login_message = 'يرجى تسجيل الدخول للوصول إلى هذه الصفحة.'
    login_manager.login_message_category = 'info'

    @login_manager.user_loader
    def load_user(user_id):
        return db.session.get(User, int(user_id))

    # تسجيل البلوبرينتس - قم بإلغاء التعليق هنا
    flask_app.register_blueprint(api_bp)
    flask_app.register_blueprint(admin_bp)

    # إنشاء مجلدات الرفع إذا لم تكن موجودة
    os.makedirs(flask_app.config['UPLOAD_FOLDER'], exist_ok=True)

    # الصفحة الرئيسية - إعادة توجيه إلى لوحة التحكم
    @flask_app.route('/')
    def index():
        return redirect(url_for('admin.dashboard'))

    # إنشاء الجداول داخل سياق التطبيق
    with flask_app.app_context():
        try:
            # اختبار الاتصال بقاعدة البيانات
            db.session.execute(db.text('SELECT 1'))
            # print("✓ Database connection successful")

            # إنشاء الجداول
            db.create_all()
            # print("✓ Tables created/updated successfully")

            # إضافة بيانات تجريبية إذا كانت قاعدة البيانات فارغة
            if Word.query.count() == 0:
                create_sample_data()

            # إنشاء المستخدم الإداري الافتراضي إذا لم يكن موجوداً
            if User.query.count() == 0:
                create_default_admin()

        except Exception as e:
            # print(f"✗ Database error: {e}")
            # print("Please check:")
            # print("1. MySQL service is running (if using MySQL)")
            # print("2. Connection settings are correct")
            # print("3. Database exists")
            sys.exit(1)

    return flask_app

def create_sample_data():
    """إنشاء بيانات تجريبية للفئات والكلمات."""
    # إضافة فئات
    categories = [
        Category(name='أساسيات', description='كلمات أساسية يومية'),
        Category(name='طعام', description='أسماء الأطعمة والمشروبات'),
        Category(name='عائلة', description='أفراد العائلة والأقارب'),
        Category(name='ألوان', description='أسماء الألوان'),
        Category(name='أرقام', description='الأرقام والعد')
    ]

    for category in categories:
        db.session.add(category)

    # إضافة كلمات تجريبية
    sample_words = [
        Word(fur_word='سلام', arabic_word='سلام', english_word='Peace', category='أساسيات'),
        Word(fur_word='ماي', arabic_word='ماء', english_word='Water', category='أساسيات'),
        Word(fur_word='نار', arabic_word='نار', english_word='Fire', category='أساسيات'),
        Word(fur_word='أكل', arabic_word='طعام', english_word='Food', category='طعام'),
        Word(fur_word='أب', arabic_word='أب', english_word='Father', category='عائلة'),
    ]

    for word in sample_words:
        db.session.add(word)

    db.session.commit()
    # print('Sample data created successfully!')

def create_default_admin():
    """إنشاء المستخدم الإداري الافتراضي."""
    admin_user = User(
        username='admin',
        email='admin@yatoy.com',
        is_admin=True,
        is_active=True
    )
    admin_user.set_password('admin123')  # كلمة مرور افتراضية

    db.session.add(admin_user)
    db.session.commit()
    # print('Default admin user created: admin / admin123')

# استدعاء دالة create_app لتهيئة التطبيق بالكامل
# هذا السطر سيتم تنفيذه عند استيراد app.py بواسطة Passenger
application = create_app(app)

if __name__ == '__main__':
    # عند تشغيل الملف مباشرة (مثل python app.py)، استخدم هذا
    # application.run(debug=True, host='0.0.0.0', port=5000)
    # لقد قمنا بالفعل بإنشاء التطبيق المهيأ أعلاه، لذا يمكننا تشغيله مباشرة
    application.run(debug=True, host='0.0.0.0', port=5000)