# -*- coding: utf-8 -*-
"""
لایه‌ی دیتابیس اپ «دیت می‌ری؟».

هر دعوت دو تا شناسه‌ی جدا داره:
  - token     → توی لینک عمومی که برای طرف مقابل فرستاده میشه (/invite/<token>)
  - view_key  → توی لینک خصوصی خود سازنده برای چک کردن نتیجه (/status/<view_key>)
این دو تا از هم جدان که کسی نتونه با حدس زدن لینک دعوت، نتیجه رو ببینه.
"""
import secrets
import sqlite3
from contextlib import contextmanager
from datetime import datetime

import config


@contextmanager
def get_conn():
    conn = sqlite3.connect(config.DB_PATH)
    conn.row_factory = sqlite3.Row
    try:
        yield conn
        conn.commit()
    finally:
        conn.close()


def init_db():
    with get_conn() as conn:
        conn.execute("""
            CREATE TABLE IF NOT EXISTS invites (
                id              INTEGER PRIMARY KEY AUTOINCREMENT,
                token           TEXT UNIQUE NOT NULL,
                view_key        TEXT UNIQUE NOT NULL,
                creator_name    TEXT NOT NULL,
                creator_phone   TEXT NOT NULL,
                recipient_name  TEXT,
                proposed_when   TEXT NOT NULL,   -- متن آزاد، مثلاً «جمعه ساعت ۸ شب»
                custom_message  TEXT,
                status          TEXT NOT NULL DEFAULT 'pending',  -- pending | yes | no
                no_taps         INTEGER NOT NULL DEFAULT 0,
                sms_sent        INTEGER NOT NULL DEFAULT 0,
                responded_at    TEXT,
                created_at      TEXT DEFAULT (datetime('now'))
            )
        """)


def create_invite(creator_name, creator_phone, recipient_name, proposed_when, custom_message):
    token = secrets.token_urlsafe(8)
    view_key = secrets.token_urlsafe(16)
    with get_conn() as conn:
        conn.execute("""
            INSERT INTO invites (token, view_key, creator_name, creator_phone,
                                  recipient_name, proposed_when, custom_message)
            VALUES (?, ?, ?, ?, ?, ?, ?)
        """, (token, view_key, creator_name, creator_phone, recipient_name, proposed_when, custom_message))
    return token, view_key


def get_by_token(token):
    with get_conn() as conn:
        row = conn.execute("SELECT * FROM invites WHERE token = ?", (token,)).fetchone()
        return dict(row) if row else None


def get_by_view_key(view_key):
    with get_conn() as conn:
        row = conn.execute("SELECT * FROM invites WHERE view_key = ?", (view_key,)).fetchone()
        return dict(row) if row else None


def record_response(token, answer):
    """answer: 'yes' یا 'no'. برمی‌گردونه که آیا این اولین باری بود که پاسخ ثبت شد."""
    with get_conn() as conn:
        row = conn.execute("SELECT status FROM invites WHERE token = ?", (token,)).fetchone()
        if not row:
            return None
        already_answered = row["status"] in ("yes", "no")
        if answer == "no":
            conn.execute("UPDATE invites SET no_taps = no_taps + 1 WHERE token = ?", (token,))
            return False  # 'no' هیچوقت باعث نوتیف یا قفل‌شدن نمیشه
        if not already_answered:
            conn.execute("""
                UPDATE invites SET status = 'yes', responded_at = ? WHERE token = ?
            """, (datetime.utcnow().isoformat(), token))
        return not already_answered  # True یعنی این اولین بار بود که "بله" ثبت شد


def mark_sms_sent(token):
    with get_conn() as conn:
        conn.execute("UPDATE invites SET sms_sent = 1 WHERE token = ?", (token,))
