# -*- coding: utf-8 -*-
"""中台：门店运营月报审核（通过发 100 积分 / 驳回 / super 删除扣回）。"""
import datetime
from flask import render_template, request, redirect, url_for, flash, abort
from flask_login import login_required, current_user

from app.models import StoreReport, Staff, Store, Chain, Setting
from app.extensions import db
from app.services import add_points, log_action, get_setting_int
from app.admin import bp
from app.admin.views import _admin_only
from app.admin.admins import _super_only
from app.region_data import CHINA_REGION


# 门店运营审核通过积分后台可配（Setting key=store_report_reward，默认 100）


@bp.route("/store-reports", methods=["GET", "POST"])
@login_required
def store_reports():
    _admin_only()
    if request.method == "POST":
        # 保存审核通过积分（后台可配）
        reward = request.form.get("reward", 100, type=int)
        if reward < 0:
            reward = 0
        row = Setting.query.get("store_report_reward")
        if not row:
            row = Setting(key="store_report_reward")
            db.session.add(row)
        row.value = str(reward)
        db.session.commit()
        log_action("store_report_rule", target_type="setting", summary="门店运营审核奖励设为 %d 分" % reward)
        flash("已保存积分设置", "success")
        return redirect(url_for("admin.store_reports"))
    status = request.args.get("status", "pending").strip()
    year = request.args.get("year", "").strip()
    month = request.args.get("month", "").strip()
    chain = request.args.get("chain", "").strip()
    province = request.args.get("province", "").strip()
    city = request.args.get("city", "").strip()
    sq = request.args.get("sq", "").strip()
    query = StoreReport.query.join(StoreReport.staff).filter(Staff.deleted == False)
    if status == "reviewed":
        query = query.filter(StoreReport.status.in_(("approved", "rejected")))
    elif status in ("pending", "approved", "rejected"):
        query = query.filter(StoreReport.status == status)
    if year and month:
        query = query.filter(StoreReport.period == "%s-%02d" % (int(year), int(month)))
    elif year:
        query = query.filter(StoreReport.period.like(year + "-%"))
    elif month:
        query = query.filter(StoreReport.period.like("__-%02d" % int(month)))
    if chain:
        query = query.join(Store, Staff.store_id == Store.id).filter(Store.chain_id == int(chain))
    if province:
        query = query.filter(Staff.province == province)
    if city:
        query = query.filter(Staff.city == city)
    if sq:
        query = query.filter(db.or_(Staff.name.contains(sq), Staff.phone.contains(sq)))
    reps = query.order_by(StoreReport.id.desc()).limit(200).all()
    chains = Chain.query.order_by(Chain.name).all()
    years = sorted({r[0][:4] for r in db.session.query(StoreReport.period).all()
                    if r[0] and len(r[0]) >= 4}, reverse=True)
    return render_template("admin/store_report_review.html", reps=reps, status=status,
                           year=year, month=month, chain=chain, province=province, city=city, sq=sq,
                           chains=chains, years=years, china_region=CHINA_REGION,
                           reward=get_setting_int("store_report_reward", 100), active="store_reports")


@bp.route("/store-reports/<int:id>/approve", methods=["POST"])
@login_required
def store_report_approve(id):
    _admin_only()
    # 行锁串行化并发审核，防双击/并发重复发分
    rep = db.session.query(StoreReport).filter(StoreReport.id == id).with_for_update().first()
    if not rep:
        abort(404)
    if rep.status != "pending":
        flash("该提交已处理", "danger")
        return redirect(url_for("admin.store_reports"))
    reward = get_setting_int("store_report_reward", 100)
    rep.status = "approved"
    rep.reviewer_id = current_user.id
    rep.reviewed_at = datetime.datetime.now()
    rep.points_earned = reward
    ok = add_points(rep.staff, reward, "store_report", ref_id=rep.id,
                    remark="门店运营月报奖励（%s）" % rep.period, commit=False)
    if not ok:
        db.session.rollback()
        flash("发分失败，请重试", "danger")
        return redirect(url_for("admin.store_reports"))
    log_action("store_report_approve", target_type="store_report", target_id=id,
               summary="通过 %s 的门店运营月报(%s)，发分 %d" % (
                   rep.staff.name if rep.staff else "?", rep.period, reward), commit=False)
    db.session.commit()
    flash("已通过，发放积分 %d" % reward, "success")
    return redirect(url_for("admin.store_reports"))


@bp.route("/store-reports/<int:id>/reject", methods=["POST"])
@login_required
def store_report_reject(id):
    _admin_only()
    rep = StoreReport.query.get_or_404(id)
    if rep.status != "pending":
        return redirect(url_for("admin.store_reports"))
    reason = request.form.get("reason", "").strip()
    if not reason:
        flash("驳回必须填写原因（将展示给店员）", "danger")
        return redirect(url_for("admin.store_reports", status="pending"))
    rep.status = "rejected"
    rep.reviewer_id = current_user.id
    rep.reviewed_at = datetime.datetime.now()
    rep.reject_reason = reason
    log_action("store_report_reject", target_type="store_report", target_id=id,
               summary="驳回 %s 的门店运营月报：%s" % (rep.staff.name if rep.staff else "?", reason), commit=False)
    db.session.commit()
    flash("已驳回", "success")
    return redirect(url_for("admin.store_reports", status="pending"))


@bp.route("/store-reports/<int:id>/delete", methods=["POST"])
@login_required
def store_report_delete(id):
    """删除门店运营月报（仅超级管理员）。仅 approved 扣回已发积分。"""
    _super_only()
    rep = StoreReport.query.get_or_404(id)
    staff = rep.staff
    pts = rep.points_earned or 0
    deduct = pts if rep.status == "approved" else 0
    if deduct > 0 and staff:
        ok = add_points(staff, -deduct, "store_report", ref_id=rep.id,
                        remark="删除门店运营月报 #%d 扣回" % rep.id, commit=False)
        if not ok:
            db.session.rollback()
            flash("无法删除：%s 积分余额不足，无法扣回 %d" % (staff.name, deduct), "danger")
            return redirect(url_for("admin.store_reports", status="reviewed"))
    summary = "删除门店运营月报 #%d（%s，状态 %s，扣回 %d）" % (
        id, staff.name if staff else "？", rep.status, deduct)
    db.session.delete(rep)
    log_action("delete_store_report", target_type="store_report", target_id=id,
               summary=summary, commit=False)
    db.session.commit()
    flash("已删除，扣回 %d 积分" % deduct, "success")
    return redirect(url_for("admin.store_reports", status="reviewed"))
