from flask import Blueprint, render_template, redirect, url_for, request, session, flash, current_app
from bson import ObjectId
from .forms import ProductForm
from .model import (
    get_available_products,
    get_sold_out_products,
    insert_product,
    get_seller_profile
)
from .utils import seller_required



seller_bp = Blueprint('seller', __name__, template_folder='templates')

@seller_bp.route('/home')
@seller_required
def home():
    db = current_app.db  # ✅ get MongoDB from Flask context
    seller_id = session.get('user')
    profile = get_seller_profile(db, seller_id)
    available = get_available_products(db, seller_id)
    sold_out = get_sold_out_products(db, seller_id)

    return render_template(
        'Seller/home.html',
        available_products=available,
        sold_out_products=sold_out,
        seller_profile=profile
    )

@seller_bp.route('/listing', methods=['GET', 'POST'])
@seller_required
def listing():
    db = current_app.db  # ✅ get MongoDB from Flask context
    form = ProductForm()
    seller_id = session.get('user')

    if form.validate_on_submit():
        new_product = {
            "name": form.name.data,
            "description": form.description.data,
            "price": float(form.price.data),
            "stock": int(form.stock.data),
            "seller_id": seller_id
        }
        insert_product(db, new_product)
        return redirect(url_for('seller.home'))

    return render_template('Seller/listing.html', form=form)

@seller_bp.route('/performance')
@seller_required
def performance():
    db = current_app.db
    seller_id = session.get('user')

    # Aggregate performance data
    pipeline = [
        {"$match": {"seller_id": seller_id}},
        {"$group": {
            "_id": "$product_name",
            "units_sold": {"$sum": "$quantity"},
            "revenue": {"$sum": "$total_price"},
            "avg_rating": {"$avg": "$rating"}
        }}
    ]

    performance_data = list(db.sales.aggregate(pipeline))
    # Format keys to match template
    for item in performance_data:
        item["name"] = item.pop("_id")

    return render_template("Seller/performance.html", performance_data=performance_data)

@seller_bp.route('/invoice')
@seller_required
def invoice():
    db = current_app.db
    seller_id = session.get('user')

    invoices = list(db.sales.find({"seller_id": seller_id}))

    # Optional: Format MongoDB _id and date
    for invoice in invoices:
        invoice["id"] = str(invoice["_id"])
        invoice["date"] = invoice.get("date", "")  # Ensure it's safe

    return render_template("Seller/invoice.html", invoices=invoices)

@seller_bp.route('/delete/<id>', methods=['POST'])
@seller_required
def delete_product(id):
    db = current_app.db  # ✅ use the same database that you inserted
    products_collection = db['products']  # ✅ correct collection name

    try:
        obj_id = ObjectId(id)
    except Exception as e:
        flash('❌ Invalid product ID format.', 'error')
        return redirect(url_for('seller.home'))

    result = products_collection.delete_one({'_id': obj_id})

    if result.deleted_count > 0:
        flash('✅ Product deleted successfully.', 'success')
    else:
        flash('❌ Product not found.', 'error')

    return redirect(url_for('seller.home'))
