#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
下载限流服务：同IP每天最多5次
"""

import os
import json
from datetime import datetime, date
from flask import Flask, request, send_file, jsonify

app = Flask(__name__)

# 下载目录
DOWNLOAD_DIR = '/usr/share/nginx/html/tgers.com.cn/downloads/'
# 日志文件
LOG_FILE = '/usr/share/nginx/html/tgers.com.cn/downloads/download_log.json'
# 允许下载的文件
ALLOWED_FILES = [
    '安耐杰物联网解决方案介绍.pdf',
    '慧程公司介绍.pdf',
    'LED大屏显示快速入门手册.pdf',
    '宇视充电桩用户手册.pdf'
]
# 每天最大下载次数
MAX_DOWNLOADS_PER_DAY = 5


def get_client_ip():
    """获取客户端IP"""
    ip = request.headers.get('X-Forwarded-For', '')
    if ip:
        ip = ip.split(',')[0].strip()
    else:
        ip = request.remote_addr or ''
    return ip


def load_logs():
    """加载下载日志"""
    if os.path.exists(LOG_FILE):
        try:
            with open(LOG_FILE, 'r', encoding='utf-8') as f:
                return json.load(f)
        except:
            return {}
    return {}


def save_logs(logs):
    """保存下载日志"""
    with open(LOG_FILE, 'w', encoding='utf-8') as f:
        json.dump(logs, f, ensure_ascii=False, indent=2)


def check_limit(ip):
    """检查下载次数限制"""
    today = date.today().isoformat()
    key = f"{ip}_{today}"
    
    logs = load_logs()
    count = logs.get(key, 0)
    
    if count >= MAX_DOWNLOADS_PER_DAY:
        return False, count
    
    # 记录下载
    logs[key] = count + 1
    save_logs(logs)
    return True, count + 1


@app.route('/download')
def download():
    """下载接口"""
    # 获取文件名
    filename = request.args.get('file', '')
    
    if not filename:
        return jsonify({'success': False, 'message': '缺少文件名'}), 400
    
    # 检查文件是否允许下载
    if filename not in ALLOWED_FILES:
        return jsonify({'success': False, 'message': '文件不存在'}), 404
    
    # 检查IP限制
    ip = get_client_ip()
    allowed, count = check_limit(ip)
    
    if not allowed:
        return jsonify({
            'success': False, 
            'message': f'今日下载次数已达上限（{MAX_DOWNLOADS_PER_DAY}次），请明天再试'
        }), 403
    
    # 文件路径
    filepath = os.path.join(DOWNLOAD_DIR, filename)
    
    if not os.path.exists(filepath):
        return jsonify({'success': False, 'message': '文件不存在'}), 404
    
    # 返回文件
    return send_file(
        filepath,
        as_attachment=True,
        download_name=filename,
        mimetype='application/pdf'
    )


@app.route('/download_status')
def download_status():
    """查询剩余下载次数"""
    ip = get_client_ip()
    today = date.today().isoformat()
    key = f"{ip}_{today}"
    
    logs = load_logs()
    count = logs.get(key, 0)
    remaining = max(0, MAX_DOWNLOADS_PER_DAY - count)
    
    return jsonify({
        'success': True,
        'ip': ip,
        'today_downloads': count,
        'remaining': remaining,
        'max_per_day': MAX_DOWNLOADS_PER_DAY
    })


if __name__ == '__main__':
    # 绑定到 127.0.0.1:8001
    app.run(host='127.0.0.1', port=8001, debug=False)
