import io

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

from app.extensions import db
from app.models.customer import Customer
from app.services.permissions import require
from app.services.activity_logger import log_action, list_logs
from config import APP_VERSION, SUPPORT_PHONE

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

ACTION_FA = {
    "login": "ورود", "logout": "خروج", "search": "جستجو", "create": "ایجاد",
    "update": "ویرایش", "delete": "حذف", "print": "پرینت", "view": "مشاهده",
    "export": "خروجی گرفتن", "report": "گزارش‌گیری",
}
ENTITY_FA = {
    "customer": "مشتری", "call": "تماس", "user": "کاربر", "tag": "تگ",
    "tag_category": "دسته تگ", "customer_rating": "رتبه مشتری", "customer_tags": "تگ مشتری",
    "customer_report": "گزارش مشتریان", "salesperson_report": "گزارش فروشنده‌ها",
}


@bp.route("/")
@login_required
@require("settings")
def index():
    deleted_customers = []
    if current_user.is_admin():
        deleted_customers = Customer.query.filter_by(is_deleted=True).order_by(Customer.first_name).all()
    return render_template("settings/index.html", app_version=APP_VERSION, support_phone=SUPPORT_PHONE,
                            deleted_customers=deleted_customers)


@bp.route("/backup")
@login_required
@require("settings")
def backup():
    from app.models import User, Permission, Customer as CustomerModel, Purchase, TagCategory, Tag, \
        CustomerTag, Call, CallTag, AppSetting
    from openpyxl import Workbook

    wb = Workbook()
    wb.remove(wb.active)
    tables = {
        "users": (User, ["id", "username", "full_name", "role", "is_active_flag", "created_at"]),
        "customers": (CustomerModel, ["id", "first_name", "last_name", "city", "mobile_phone", "status", "rating", "joined_at", "is_deleted"]),
        "purchases": (Purchase, ["id", "customer_id", "amount", "weight", "purchase_date"]),
        "calls": (Call, ["id", "customer_id", "salesperson_id", "call_date", "answered", "result_text", "next_action"]),
    }
    for sheet_name, (model, columns) in tables.items():
        ws = wb.create_sheet(title=sheet_name)
        ws.append(columns)
        for row in model.query.all():
            ws.append([str(getattr(row, c)) if getattr(row, c) is not None else "" for c in columns])

    buffer = io.BytesIO()
    wb.save(buffer)
    buffer.seek(0)
    log_action(current_user, "export", "backup")
    from datetime import datetime
    stamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    return send_file(buffer, mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                      as_attachment=True, download_name=f"backup-{stamp}.xlsx")


@bp.route("/logs")
@login_required
@require("settings")
def logs():
    if not current_user.is_admin():
        abort(403)
    search = request.args.get("q", "").strip().lower()
    action_filter = request.args.get("action", "")
    rows = list_logs(limit=500)
    if action_filter:
        rows = [r for r in rows if r.action_type == action_filter]
    if search:
        rows = [r for r in rows if search in (r.username or "").lower()
                or search in str(r.details or "").lower()]
    return render_template("settings/logs.html", rows=rows, action_fa=ACTION_FA, entity_fa=ENTITY_FA,
                            q=request.args.get("q", ""), selected_action=action_filter)


@bp.route("/customers/<int:customer_id>/restore", methods=["POST"])
@login_required
@require("settings")
def restore_customer(customer_id):
    if not current_user.is_admin():
        abort(403)
    customer = db.session.get(Customer, customer_id) or abort(404)
    customer.is_deleted = False
    db.session.commit()
    log_action(current_user, "update", "customer", customer_id,
               {"name": f"{customer.first_name} {customer.last_name}", "action": "restore"})
    flash(f"«{customer.first_name} {customer.last_name}» بازیابی شد", "success")
    return redirect(url_for("settings.index"))
