# -*- coding: utf-8 -*-
"""中台：每日打卡设置（连续打卡奖励积分）+ 统计。"""
import datetime
from flask import render_template, request, redirect, url_for, flash
from flask_login import login_required

from app.models import Checkin, Setting, Staff
from app.extensions import db
from app.admin import bp
from app.admin.views import _admin_only
from app.admin.admins import _super_only
from app.services import log_action, get_setting_int, add_points


@bp.route("/checkin", methods=["GET", "POST"])
@login_required
def checkin_admin():
    _admin_only()
    if request.method == "POST":
        reward = request.form.get("reward", 1, type=int)
        if reward < 0:
            reward = 0
        row = Setting.query.get("checkin_reward")
        if not row:
            row = Setting(key="checkin_reward")
            db.session.add(row)
        row.value = str(reward)
        db.session.commit()
        log_action("checkin_rule", target_type="setting", summary="每日打卡奖励设为 %d 分/天" % reward)
        flash("已保存打卡规则", "success")
        return redirect(url_for("admin.checkin_admin"))
    reward = get_setting_int("checkin_reward", 1)
    today = datetime.date.today()
    today_n = Checkin.query.filter_by(checkin_date=today).count()
    yesterday_n = Checkin.query.filter_by(checkin_date=today - datetime.timedelta(days=1)).count()
    total_n = Checkin.query.count()
    return render_template("admin/checkin.html", reward=reward, today_n=today_n,
                           yesterday_n=yesterday_n, total_n=total_n, active="checkin")


@bp.route("/checkin/today")
@login_required
def checkin_today():
    """今日（或指定日期）打卡详情：谁、连锁、门店、时间、IP。"""
    _admin_only()
    date_str = request.args.get("date", "").strip()
    try:
        date = datetime.date.fromisoformat(date_str) if date_str else datetime.date.today()
    except ValueError:
        date = datetime.date.today()
    rows = (Checkin.query.join(Checkin.staff).filter(Staff.deleted == False)
            .filter(Checkin.checkin_date == date)
            .order_by(Checkin.created_at.desc()).all())
    return render_template("admin/checkin_today.html", date=date, rows=rows, active="checkin")


@bp.route("/checkin/<int:id>/delete", methods=["POST"])
@login_required
def checkin_delete(id):
    """删除打卡记录（仅超级管理员）。逆向：扣回当时发的积分 + 删记录，一次事务。"""
    _super_only()
    c = Checkin.query.get_or_404(id)
    staff = c.staff
    pts = c.points_earned or 0
    if staff and pts > 0:
        ok = add_points(staff, -pts, "checkin", ref_id=c.id,
                        remark="删除打卡 #%d 扣回（%s）" % (c.id, c.checkin_date), commit=False)
        if not ok:
            db.session.rollback()
            flash("无法删除：%s 当前积分余额不足，无法扣回 %d 积分" % (staff.name, pts), "danger")
            return redirect(url_for("admin.checkin_today", date=c.checkin_date))
    summary = "删除打卡 #%d（%s，%s，扣回 %d 积分）" % (
        c.id, staff.name if staff else "？", c.checkin_date, pts)
    db.session.delete(c)
    log_action("delete_checkin", target_type="checkin", target_id=id,
               summary=summary, commit=False)
    db.session.commit()
    flash("已删除打卡记录 #%d，扣回 %d 积分" % (id, pts), "success")
    return redirect(url_for("admin.checkin_today", date=c.checkin_date))
