# -*- coding: utf-8 -*-
"""
اپ «دیت می‌ری؟» — یه صفحه‌ی تک‌کاره: کسی یه لینک دعوت می‌سازه، برای طرف مقابل
می‌فرسته، و وقتی جواب «بله» گرفت، هم توی مرورگر پیام می‌بینه هم به گوشیش پیامک میره.
"""
import os

from flask import Flask, abort, jsonify, redirect, render_template, request, url_for
from flask_wtf import CSRFProtect

import config
import database as db
import sms

BASE_DIR = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)
app.config["SECRET_KEY"] = config.SECRET_KEY
csrf = CSRFProtect(app)


@app.context_processor
def inject_site_base_url():
    return {"site_base_url": config.SITE_BASE_URL}


@app.route("/", methods=["GET", "POST"])
def create():
    if request.method == "POST":
        creator_name = (request.form.get("creator_name") or "").strip()
        creator_phone = (request.form.get("creator_phone") or "").strip()
        recipient_name = (request.form.get("recipient_name") or "").strip()
        proposed_when = (request.form.get("proposed_when") or "").strip()
        custom_message = (request.form.get("custom_message") or "").strip()

        error = None
        if not creator_name or len(creator_name) > 60:
            error = "اسم خودت رو وارد کن."
        elif not creator_phone or len(creator_phone) < 10:
            error = "شماره موبایلت رو درست وارد کن (برای اطلاع‌رسانی جواب لازمه)."
        elif not proposed_when:
            error = "زمان پیشنهادی رو بنویس."

        if error:
            return render_template("create.html", error=error, form=request.form)

        token, view_key = db.create_invite(
            creator_name, creator_phone, recipient_name, proposed_when, custom_message
        )
        invite_url = url_for("invite", token=token, _external=True)
        status_url = url_for("status", view_key=view_key, _external=True)
        return render_template("created.html", invite_url=invite_url, status_url=status_url)

    return render_template("create.html", error=None, form=None)


@app.route("/invite/<token>")
def invite(token):
    inv = db.get_by_token(token)
    if not inv:
        abort(404)
    return render_template("invite.html", inv=inv)


@app.route("/invite/<token>/respond", methods=["POST"])
@csrf.exempt
def respond(token):
    inv = db.get_by_token(token)
    if not inv:
        return jsonify({"ok": False, "error": "not_found"}), 404

    answer = (request.get_json(silent=True) or {}).get("answer")
    if answer not in ("yes", "no"):
        return jsonify({"ok": False, "error": "bad_answer"}), 400

    is_first_yes = db.record_response(token, answer)

    if answer == "yes" and is_first_yes:
        recipient_label = inv["recipient_name"] or "یکی از طرفدارات"
        message = (
            f"❤️ خبر خوب! {recipient_label} به دعوتِ «{inv['proposed_when']}» جواب بله داد!"
        )
        if sms.send_sms(inv["creator_phone"], message):
            db.mark_sms_sent(token)

    return jsonify({"ok": True})


@app.route("/status/<view_key>")
def status(view_key):
    inv = db.get_by_view_key(view_key)
    if not inv:
        abort(404)
    return render_template("status.html", inv=inv)


if __name__ == "__main__":
    db.init_db()
    app.run(debug=True, port=5050)
