import os
import json
from datetime import datetime
from flask import Flask, request, jsonify

app = Flask(__name__)

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
UPLOAD_DIR = os.path.join(BASE_DIR, "uploads")
LOG_DIR = os.path.join(BASE_DIR, "logs")

os.makedirs(UPLOAD_DIR, exist_ok=True)
os.makedirs(LOG_DIR, exist_ok=True)


def write_log(data):
    log_file = os.path.join(LOG_DIR, "api.log")
    line = f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {json.dumps(data, ensure_ascii=False)}\n"
    with open(log_file, "a", encoding="utf-8") as f:
        f.write(line)


@app.route("/ping", methods=["GET"])
def ping():
    result = {
        "success": True,
        "message": "Flask server is running",
        "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    }
    write_log({"endpoint": "/ping", "result": result})
    return jsonify(result)


@app.route("/echo", methods=["POST"])
def echo():
    try:
        data = request.get_json(silent=True) or {}
        message = str(data.get("message", "")).strip()

        result = {
            "success": True,
            "original": message,
            "length": len(message),
            "upper": message.upper(),
            "lower": message.lower(),
            "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        }

        write_log({"endpoint": "/echo", "request": data, "result": result})
        return jsonify(result)

    except Exception as e:
        error_result = {
            "success": False,
            "error": str(e)
        }
        write_log({"endpoint": "/echo", "error": error_result})
        return jsonify(error_result), 500


@app.route("/sum", methods=["POST"])
def calc_sum():
    try:
        data = request.get_json(silent=True) or {}

        a = int(data.get("a", 0))
        b = int(data.get("b", 0))

        result = {
            "success": True,
            "a": a,
            "b": b,
            "sum": a + b,
            "subtract": a - b,
            "multiply": a * b,
            "divide": round(a / b, 4) if b != 0 else None,
            "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        }

        write_log({"endpoint": "/sum", "request": data, "result": result})
        return jsonify(result)

    except ValueError:
        error_result = {
            "success": False,
            "error": "숫자만 입력해야 합니다."
        }
        write_log({"endpoint": "/sum", "error": error_result})
        return jsonify(error_result), 400

    except Exception as e:
        error_result = {
            "success": False,
            "error": str(e)
        }
        write_log({"endpoint": "/sum", "error": error_result})
        return jsonify(error_result), 500


@app.route("/analyze-file", methods=["POST"])
def analyze_file():
    try:
        if "file" not in request.files:
            return jsonify({
                "success": False,
                "error": "업로드된 파일이 없습니다."
            }), 400

        file = request.files["file"]

        if file.filename == "":
            return jsonify({
                "success": False,
                "error": "파일명이 비어 있습니다."
            }), 400

        original_name = file.filename
        safe_name = original_name.replace("/", "_").replace("\\", "_")
        save_path = os.path.join(UPLOAD_DIR, safe_name)
        file.save(save_path)

        file_size = os.path.getsize(save_path)
        ext = os.path.splitext(safe_name)[1].lower()

        preview = ""
        text_extensions = [".txt", ".log", ".csv", ".json", ".html", ".xml"]

        if ext in text_extensions:
            try:
                with open(save_path, "r", encoding="utf-8", errors="ignore") as f:
                    preview = f.read(500)
            except Exception:
                preview = "텍스트 미리보기를 읽을 수 없습니다."

        result = {
            "success": True,
            "filename": safe_name,
            "extension": ext,
            "saved_path": save_path,
            "size_bytes": file_size,
            "size_kb": round(file_size / 1024, 2),
            "preview": preview,
            "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        }

        write_log({"endpoint": "/analyze-file", "result": result})
        return jsonify(result)

    except Exception as e:
        error_result = {
            "success": False,
            "error": str(e)
        }
        write_log({"endpoint": "/analyze-file", "error": error_result})
        return jsonify(error_result), 500


@app.route("/server-info", methods=["GET"])
def server_info():
    try:
        result = {
            "success": True,
            "python_version": os.sys.version,
            "current_dir": BASE_DIR,
            "upload_dir": UPLOAD_DIR,
            "log_dir": LOG_DIR,
            "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        }
        write_log({"endpoint": "/server-info", "result": result})
        return jsonify(result)
    except Exception as e:
        error_result = {
            "success": False,
            "error": str(e)
        }
        return jsonify(error_result), 500


if __name__ == "__main__":
    app.run(host="127.0.0.1", port=8000, debug=True)