# -*- coding: utf-8 -*-
"""中台：积分流水查询 + 手动调整。"""
import csv
import io
import datetime
from flask import render_template, request, redirect, url_for, flash, Response
from flask_login import login_required

from app.models import Staff, PointsLog
from app.extensions import db
from app.admin import bp
from app.admin.views import _admin_only
from app.services import add_points, log_action


@bp.route("/points")
@login_required
def points():
    _admin_only()
    staff_id = request.args.get("staff_id", type=int)
    ptype = request.args.get("type", "").strip()
    query = PointsLog.query.join(PointsLog.staff).filter(Staff.deleted == False)
    if staff_id:
        query = query.filter(PointsLog.staff_id == staff_id)
    if ptype:
        query = query.filter(PointsLog.type == ptype)
    logs = query.order_by(PointsLog.id.desc()).limit(200).all()
    staffs = Staff.query.filter_by(role="staff", deleted=False).order_by(Staff.name).all()
    return render_template("admin/points.html", logs=logs, staffs=staffs,
                           staff_id=staff_id, ptype=ptype, active="points")


@bp.route("/points/adjust", methods=["POST"])
@login_required
def points_adjust():
    _admin_only()
    staff_id = request.form.get("staff_id", type=int)
    delta = request.form.get("delta", type=int)
    remark = request.form.get("remark", "").strip()
    s = Staff.query.get_or_404(staff_id)
    if delta is None or delta == 0:
        flash("积分变动数不能为 0", "danger")
        return redirect(url_for("admin.points"))
    # add_points 原子更新；扣分余额不足时返回 None（未改动）
    log = add_points(s, delta, "adjust", remark="中台调整：" + (remark or "无备注"), commit=False)
    if log is None:
        flash("%s 积分不足（当前余额 %d）" % (s.name, s.points_balance), "danger")
        return redirect(url_for("admin.points"))
    log_action("points_adjust", target_type="staff", target_id=s.id,
               summary="%s %s %d 积分（%s）→ 余额 %d" % (
                   s.name, "加" if delta > 0 else "扣", abs(delta), remark or "无备注", log.balance_after),
               commit=False)
    db.session.commit()
    flash("已为 %s %s %d 积分（余额 %d）" % (
        s.name, ("加" if delta > 0 else "扣"), abs(delta), log.balance_after), "success")
    return redirect(url_for("admin.points"))


@bp.route("/points/export")
@login_required
def points_export():
    _admin_only()
    logs = (PointsLog.query.join(PointsLog.staff).filter(Staff.deleted == False)
            .order_by(PointsLog.id.desc()).limit(5000).all())
    out = io.StringIO()
    out.write("﻿")
    w = csv.writer(out)
    w.writerow(["ID", "店员", "手机号", "门店", "变动", "类型", "备注", "变动后余额", "时间"])
    for l in logs:
        w.writerow([l.id, l.staff.name if l.staff else "", l.staff.phone if l.staff else "",
                    l.staff.store.name if (l.staff and l.staff.store) else "",
                    l.delta, l.type, l.remark or "", l.balance_after,
                    l.created_at.strftime("%Y-%m-%d %H:%M") if l.created_at else ""])
    return Response(out.getvalue(), mimetype="text/csv",
                    headers={"Content-Disposition": "attachment; filename=points_%s.csv" % datetime.date.today()})
