"""
Aliex POS System - Main Application Entry Point
"""

import os
from flask import Flask, render_template
from flask_login import LoginManager
from config import config
from models import db, User, Product
from datetime import datetime, timezone
from timezone_helper import get_local_now, utc_to_local, format_local_datetime, format_local_date, time_ago_local, HARARE_TZ

app = Flask(__name__)

config_name = os.environ.get('FLASK_ENV', 'development')
app.config.from_object(config[config_name])

db.init_app(app)

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'auth.login'
login_manager.login_message = 'Please log in to access this page.'
login_manager.login_message_category = 'info'

@login_manager.user_loader
def load_user(user_id):
    return db.session.get(User, int(user_id))

from auth import auth_bp
from routes import main_bp

app.register_blueprint(auth_bp)
app.register_blueprint(main_bp)

with app.app_context():
    db.create_all()
    
    if User.query.count() == 0:
        super_admin = User(
            username='admin',
            email='admin@aliex.com',
            full_name='System Administrator',
            role='super_admin',
            is_active=True
        )
        super_admin.set_password('admin123')
        db.session.add(super_admin)
        db.session.commit()
        print("=" * 50)
        print("Default Super Admin created!")
        print("Username: admin")
        print("Password: admin123")
        print("PLEASE CHANGE THE DEFAULT PASSWORD!")
        print("=" * 50)

@app.errorhandler(404)
def not_found_error(error):
    return render_template('404.html'), 404

@app.errorhandler(500)
def internal_error(error):
    db.session.rollback()
    return render_template('500.html'), 500

@app.errorhandler(403)
def forbidden_error(error):
    return render_template('403.html'), 403

@app.context_processor
def utility_processor():
    def format_currency(amount):
        if amount is None:
            return '$0.00'
        
        try:
            amount_float = float(amount)
            currency = app.config.get('CURRENCY_SYMBOL', '$')
            return f"{currency}{amount_float:,.2f}"
        except (ValueError, TypeError):
            return '$0.00'
    
    def format_datetime(dt):
        return format_local_datetime(dt)
    
    def format_date(dt):
        return format_local_date(dt)
    
    def time_ago(dt):
        return time_ago_local(dt)
    
    def get_local_time():
        return get_local_now()
    
    # Get low stock count for badge
    low_stock_count = 0
    try:
        low_stock_count = Product.query.filter(
            Product.is_active == True,
            Product.quantity <= Product.min_quantity
        ).count()
    except:
        pass
    
    return dict(
        format_currency=format_currency,
        format_datetime=format_datetime,
        format_date=format_date,
        time_ago=time_ago,
        get_local_time=get_local_time,
        now=get_local_now(),
        low_stock_count=low_stock_count
    )

if __name__ == '__main__':
    host = os.environ.get('HOST', '0.0.0.0')
    port = int(os.environ.get('PORT', 5000))
    debug = os.environ.get('FLASK_ENV', 'development') == 'development'
    app.run(host=host, port=port, debug=debug)