#!/usr/bin/env python
"""
Dabaywa Sudan – Production Database Initialization Script

Usage:
    # Set environment variables first:
    #   DATABASE_URL=mysql+pymysql://user:password@host/dabaywa_sudan
    #   SECRET_KEY=your-secret-key
    #   FLASK_CONFIG=production

    python init_db.py

    # Or with inline env vars:
    DATABASE_URL="mysql+pymysql://user:pass@localhost/dabaywa_sudan" \
    SECRET_KEY="change-me-to-a-real-secret" \
    FLASK_CONFIG=production \
    python init_db.py

    # Options:
    python init_db.py --reset          # DROP all tables and recreate (DESTRUCTIVE)
    python init_db.py --admin-only     # Only create/reset the admin user
"""

import os
import sys
import argparse
os.environ['DATABASE_URL'] = 'mysql+pymysql://tezloans_dabaywa:Test%PASS123@148.113.4.193/tezloans_dabaywa'
os.environ['SECRET_KEY'] = 'dabaywa@sudan'
# Ensure we can import from the app directory
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from app import create_app
from models import db, User, Category, Tag, SiteSettings
from slugify import slugify


# ── Default data ────────────────────────────────────────────────────────

DEFAULT_CATEGORIES = [
    ('Red Sea', 'البحر الأحمر', '#c70000', 1),
    ('Kassala', 'كسلا', '#0077b6', 2),
    ('Gedaref', 'القضارف', '#2a7a2a', 3),
    ('National News', 'أخبار وطنية', '#7d0068', 4),
    ('Politics', 'سياسة', '#052962', 5),
    ('Economy', 'اقتصاد', '#bb3b0e', 6),
    ('Sports', 'رياضة', '#0084c6', 7),
    ('Culture', 'ثقافة', '#a1845c', 8),
    ('Opinion', 'رأي', '#ff5943', 9),
]

DEFAULT_SETTINGS = {
    'header_logo': 'images/logo.jpeg',
    'footer_logo': 'images/logo.jpeg',
    'header_logo_height': '80',
    'footer_logo_height': '300',
}


def create_admin(app):
    """Create default admin user if none exists."""
    with app.app_context():
        existing = User.query.filter_by(role='admin').first()
        if existing:
            print(f"  Admin user already exists: {existing.username}")
            return

        # Allow overriding via env vars
        username = os.environ.get('ADMIN_USERNAME', 'admin')
        email = os.environ.get('ADMIN_EMAIL', 'admin@dabaywa.sd')
        password = os.environ.get('ADMIN_PASSWORD', 'admin123')

        admin = User(
            username=username,
            email=email,
            display_name='Administrator',
            display_name_ar='المسؤول',
            role='admin',
            is_active_user=True,
        )
        admin.set_password(password)
        db.session.add(admin)
        db.session.commit()
        print(f"  Admin user created: {username}")
        if password == 'admin123':
            print("  ⚠  WARNING: Using default password 'admin123'. Change it immediately!")


def create_categories(app):
    """Seed default categories if table is empty."""
    with app.app_context():
        if Category.query.first():
            print(f"  Categories already exist ({Category.query.count()} found), skipping.")
            return

        for name_en, name_ar, color, order in DEFAULT_CATEGORIES:
            cat = Category(
                name_en=name_en,
                name_ar=name_ar,
                slug=slugify(name_en),
                description_en='',
                description_ar='',
                color=color,
                order=order,
                is_active=True,
            )
            db.session.add(cat)

        db.session.commit()
        print(f"  Created {len(DEFAULT_CATEGORIES)} default categories.")


def create_settings(app):
    """Seed default site settings if not present."""
    with app.app_context():
        created = 0
        for key, value in DEFAULT_SETTINGS.items():
            if not SiteSettings.query.filter_by(key=key).first():
                db.session.add(SiteSettings(key=key, value=value))
                created += 1
        db.session.commit()
        if created:
            print(f"  Created {created} default settings.")
        else:
            print("  Site settings already exist, skipping.")


def init_database(reset=False):
    """Initialize the production database."""
    config_name = os.environ.get('FLASK_CONFIG', 'production')
    app = create_app(config_name)

    db_uri = app.config['SQLALCHEMY_DATABASE_URI']
    # Mask password in output
    safe_uri = db_uri
    if '@' in db_uri:
        pre, post = db_uri.split('@', 1)
        if ':' in pre.rsplit('/', 1)[-1]:
            safe_uri = pre.rsplit(':', 1)[0] + ':****@' + post
    print(f"\nDatabase: {safe_uri}")
    print(f"Config:   {config_name}\n")

    with app.app_context():
        if reset:
            print("[1/5] Dropping all tables...")
            db.drop_all()
            print("  Done.")
        else:
            print("[1/5] Skipping drop (use --reset to drop tables)")

        print("[2/5] Creating tables...")
        db.create_all()
        print("  All tables created.")

        print("[3/5] Creating admin user...")
        create_admin(app)

        print("[4/5] Seeding categories...")
        create_categories(app)

        print("[5/5] Seeding site settings...")
        create_settings(app)

    print("\n✓ Database initialization complete.\n")
    print("Upload directories needed on the server:")
    print("  static/uploads/images/")
    print("  static/uploads/videos/")
    print("  static/uploads/audio/")
    print("  static/uploads/avatars/")
    print("  static/uploads/logos/")
    print("  static/images/          (for the default logo)")


def reset_admin():
    """Reset only the admin user."""
    config_name = os.environ.get('FLASK_CONFIG', 'production')
    app = create_app(config_name)

    with app.app_context():
        # Delete existing admin
        admins = User.query.filter_by(role='admin').all()
        for a in admins:
            db.session.delete(a)
        db.session.commit()
        print("Removed existing admin users.")

        create_admin(app)

    print("\n✓ Admin user reset complete.")


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Initialize Dabaywa Sudan production database')
    parser.add_argument('--reset', action='store_true',
                        help='DROP all tables and recreate (DESTRUCTIVE!)')
    parser.add_argument('--admin-only', action='store_true',
                        help='Only create/reset the admin user')
    args = parser.parse_args()

    if args.reset:
        confirm = input("⚠  This will DELETE ALL DATA. Type 'yes' to confirm: ")
        if confirm.strip().lower() != 'yes':
            print("Aborted.")
            sys.exit(0)

    if args.admin_only:
        reset_admin()
    else:
        init_database(reset=args.reset)
