from flask import Blueprint, render_template, redirect, url_for, flash, request, abort
from flask_login import login_required, current_user

from app.extensions import db
from app.models.customer import Customer, Purchase
from app.services.permissions import require
from app.services.activity_logger import log_action
from app.services import customer_service
from app.services.jalali import jalali_str_to_gregorian_date, to_jalali_str, to_en_digits, iran_today
from app.blueprints.weight.forms import WeightEntryForm

bp = Blueprint("weight", __name__, url_prefix="/weight")


def _parse_weight(raw: str):
    cleaned = to_en_digits(raw).replace(",", "").strip()
    value = float(cleaned)
    if value <= 0:
        raise ValueError("weight must be positive")
    return value


@bp.route("/new")
@login_required
@require("weight_management")
def search():
    q = request.args.get("q", "").strip()
    results = customer_service.search_by_name(q) if q else []
    return render_template("weight/search.html", q=q, results=results)


@bp.route("/new/<int:customer_id>", methods=["GET", "POST"])
@login_required
@require("weight_management")
def new_entry(customer_id):
    customer = db.session.get(Customer, customer_id) or abort(404)
    if customer.is_deleted:
        abort(404)

    form = WeightEntryForm()
    if request.method == "GET":
        form.purchase_date.data = to_jalali_str(iran_today())

    if form.validate_on_submit():
        try:
            weight = _parse_weight(form.weight.data)
        except (ValueError, TypeError):
            flash("وزن وارد شده معتبر نیست", "error")
            return render_template("weight/entry.html", form=form, customer=customer)
        try:
            purchase_date = jalali_str_to_gregorian_date(form.purchase_date.data)
        except Exception:
            flash("تاریخ وارد شده معتبر نیست", "error")
            return render_template("weight/entry.html", form=form, customer=customer)

        purchase = Purchase(
            customer_id=customer.id, amount=0, weight=weight,
            purchase_date=purchase_date, registered_by=current_user.id,
            description="ثبت وزن از طریق مدیریت وزن",
        )
        db.session.add(purchase)
        db.session.commit()
        customer_service.refresh_statuses([customer.id])
        log_action(current_user, "create", "purchase_weight", purchase.id,
                   {"customer_id": customer.id, "weight": weight, "purchase_date": form.purchase_date.data})
        flash(f"وزن {('{:,.3f}'.format(weight))} گرم برای «{customer.first_name} {customer.last_name}» ثبت شد — می‌توانید مورد بعدی را وارد کنید", "success")
        return redirect(url_for("weight.new_entry", customer_id=customer.id))

    return render_template("weight/entry.html", form=form, customer=customer)
