from flask import Flask, request, jsonify
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import pymysql
import os
import ssl
from datetime import datetime, timedelta, timezone

app = Flask(__name__)
app.json.ensure_ascii = False  # 日本語を綺麗に出力

# 🌟 日本時間 (JST) ゾーンの定義
JST = timezone(timedelta(hours=9))

# ==━━━━━━━━━━━━━━━━━━━━━━━━
# ⚙️ サンドバッグ用・設定エリア（大将はパスワードのみ書き換え！）
# ==━━━━━━━━━━━━━━━━━━━━━━━━

# 1. データベース（MySQL）設定
DB_HOST = '127.0.0.1'
DB_PORT = 3306
DB_USER = 'candgclo_poduser'       # cPanelのDBユーザー名
DB_PASSWORD = 'nNNWCi}~fN@MTzs6'  # 🌟【大将ご担当：実際のMySQLパスワードを入力！】
DB_NAME = 'candgclo_poddb'         # cPanel’のデータベース名

# 2. メール送信設定（大将のサンドバッグドメイン専用！）
SMTP_HOST = 'mail.house-cook.com'  # サンドバッグ側のメールホスト
SMTP_PORT = 465                     # SSLセキュア送信ポート
SMTP_USER = 'noreply@house-cook.com' # 🌟【大将ご担当：設定済みの実在メールアドレス！】
SMTP_PASSWORD = 'nNNWCi}~fN@MTzs6'  # 🌟【大将ご担当：設定したメールパスワード！】
SENDER_NAME = '世界PODエージェント(テスト)'
RECIPIENT_EMAIL = 'islandsupper20@gmail.com' # アボイさん受け取り用Gmail

# APIトークン（絶対防衛ライン）
API_TOKEN = 'PODagentTKN'

# ==━━━━━━━━━━━━━━━━━━━━━━━━
# 🛠️ データベース接続＆インサート関数
# ==━━━━━━━━━━━━━━━━━━━━━━━━
def save_to_database(data):
    connection = None
    try:
        connection = pymysql.connect(
            host=DB_HOST,
            port=DB_PORT,
            user=DB_USER,
            password=DB_PASSWORD,
            database=DB_NAME,
            charset='utf8mb4',
            cursorclass=pymysql.cursors.DictCursor
        )
        
        with connection.cursor() as cursor:
            # テーブル 'nc_creators' の存在チェック
            cursor.execute("SHOW TABLES LIKE 'nc_creators'")
            table_exists = cursor.fetchone()
            if not table_exists:
                return False, "【致命的エラー】データベース内にテーブル 'nc_creators' が存在しません。"

            # 重複登録チェック (直近1時間以内の同一 desired_id はスルー)
            desired_id = data.get('desired_id', '')
            cursor.execute(
                "SELECT id FROM nc_creators WHERE wp_user_id = %s AND created_at > %s", 
                (desired_id, (datetime.now(JST) - timedelta(hours=1)).strftime('%Y-%m-%d %H:%M:%S'))
            )
            if cursor.fetchone():
                return True, "重複送信を検知したため、安全にスキップしました（二重登録防止）"

            # データの取得とマッピング
            last_name = data.get('last_name', '')
            first_name = data.get('first_name', '')
            full_name = f"{last_name} {first_name}".strip()
            
            creator_id = data.get('creator_id', '')
            wp_user_id = desired_id
            branch_code = 'NIP'
            email = data.get('email', 'noreply@house-cook.com')
            status = 'active'
            now_jst = datetime.now(JST).strftime('%Y-%m-%d %H:%M:%S')

            sql = """
            INSERT INTO nc_creators (id, wp_user_id, branch_code, name, email, creator_status, created_at)
            VALUES (%s, %s, %s, %s, %s, %s, %s)
            """
            cursor.execute(sql, (creator_id, wp_user_id, branch_code, full_name, email, status, now_jst))
            
        connection.commit()
        return True, "DB登録完了"
    except Exception as e:
        return False, f"SQL実行エラー: {str(e)}"
    finally:
        if connection:
            connection.close()

# ==━━━━━━━━━━━━━━━━━━━━━━━━
# ✉️ メール発射関数（お礼通知）
# ==━━━━━━━━━━━━━━━━━━━━━━━━
def send_notification_email(data):
    try:
        last_name = data.get('last_name', '')
        first_name = data.get('first_name', '')
        full_name = f"{last_name} {first_name}".strip()
        
        email_body = f"""世界PODエージェント メンバー申込み通知（サンドバッグ検証）

新規メンバーがサンドバッグ環境のDB（nc_creators）に着陸完了しました！

━━━━━━━━━━━━━━━━━━━━━━━━
【お申込み内容の要約】
━━━━━━━━━━━━━━━━━━━━━━━━
・登録クリエイター名（希望ID）: {data.get('desired_id', 'test_user')}
・割り当てID: {data.get('creator_id', 'TEST001')}
・氏名: {full_name or 'テスト 太郎'}
・都道府県: {data.get('prefecture', '東京都')}
・性別: {data.get('gender', '男性')}
・年代: {data.get('age_group', '40代')}
━━━━━━━━━━━━━━━━━━━━━━━━

※このメールは、cPanel上のPython API（app.py）から直接自動送信されました。
"""
        msg = MIMEText(email_body, 'plain', 'utf-8')
        msg['Subject'] = Header("【サンドバッグ開通テスト】世界PODエージェント 動作確認メール", 'utf-8')
        
        sender_header_encoded = Header(SENDER_NAME, 'utf-8').encode()
        msg['From'] = f'{sender_header_encoded} <{SMTP_USER}>'
        msg['To'] = RECIPIENT_EMAIL
        
        reply_email = data.get('email') or RECIPIENT_EMAIL
        display_name_encoded = Header(full_name or 'テスト 太郎', 'utf-8').encode()
        msg['Reply-To'] = f'{display_name_encoded} <{reply_email}>'
        
        # 🌟 SSL証明書検証をスキップして、証明書エラーによる送信エラーを物理排除！
        context = ssl._create_unverified_context()
        server = smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT, context=context, timeout=10)
        server.login(SMTP_USER, SMTP_PASSWORD)
        server.sendmail(SMTP_USER, [RECIPIENT_EMAIL], msg.as_string())
        server.quit()
        return True, "メール送信成功"
    except Exception as e:
        return False, f"メール送信エラー: {str(e)}"

# ==━━━━━━━━━━━━━━━━━━━━━━━━
# 🌐 APIエンドポイント（お申込み受付）
# ==━━━━━━━━━━━━━━━━━━━━━━━━
@app.route('/')
@app.route('/api-creators')
def home():
    return jsonify({
        "status": "success",
        "message": "POD Agent Sandbox Backend is LIVE (Secured Area)",
        "version": "2.0.0-sandbox-victory",
        "timestamp": datetime.now(JST).strftime('%Y-%m-%d %H:%M:%S')
    })

@app.route('/new-member', methods=['POST'])
@app.route('/api-creators/new-member', methods=['POST'])
def new_member():
    token = request.headers.get('X-API-TOKEN')
    if token != API_TOKEN:
        return jsonify({"status": "error", "message": "認証に失敗しました。不正なアクセスです。"}), 403

    data = request.get_json()
    if not data:
        return jsonify({"status": "error", "message": "送信されたデータが空です。"}), 400

    # 1. DB保存
    db_success, db_message = save_to_database(data)
    if not db_success:
        return jsonify({"status": "error", "message": f"DB登録に失敗しました。{db_message}"}), 500

    # 2. メール送信
    mail_success, mail_message = send_notification_email(data)
    if not mail_success:
        # 🌟HTTP 500を返して、フロント画面のポップアップでエラー内容を直撃表示させる！
        return jsonify({
            "status": "error",
            "message": "データベースには登録されましたが、メール送信に失敗しました。",
            "debug": mail_message
        }), 500

    return jsonify({"status": "success", "message": "メンバー登録およびメール送信が完璧に完了しました！"}), 200

if __name__ == '__main__':
    app.run()
