#!/usr/bin/env python3
# api.py - ইউজারনাম, ফোন নম্বর ও ID সহ API

from flask import Flask, jsonify, request
import csv
import os
import sys
import pickle
from datetime import datetime

app = Flask(__name__)

# কনফিগারেশন
CSV_FILE = os.path.join(os.path.dirname(__file__), 'users.csv')
INDEX_FILE = os.path.join(os.path.dirname(__file__), 'phone_index.pkl')

def detect_csv_format():
    """CSV ফাইলের ফরম্যাট ডিটেক্ট করা"""
    with open(CSV_FILE, 'r', encoding='utf-8', errors='ignore') as f:
        first_line = f.readline()
        f.seek(0)
        
        # ডিলিমিটার ডিটেক্ট
        if '|' in first_line:
            delimiter = '|'
        elif '\t' in first_line:
            delimiter = '\t'
        else:
            delimiter = ','
        
        # হেডার আছে কিনা চেক
        sample = f.read(2048)
        f.seek(0)
        has_header = 'username' in sample.lower() or 'id' in sample.lower()
        
        return delimiter, has_header

def build_index():
    """CSV ফাইলের ইনডেক্স তৈরি করে (ID, Username, Phone)"""
    print("Building index from CSV...", file=sys.stderr)
    index = {}
    count = 0
    delimiter, has_header = detect_csv_format()
    
    try:
        with open(CSV_FILE, 'r', encoding='utf-8', errors='ignore') as f:
            reader = csv.reader(f, delimiter=delimiter)
            
            # হেডার স্কিপ করা
            header = None
            if has_header:
                header = next(reader)
                print(f"Headers found: {header}", file=sys.stderr)
            
            for row in reader:
                if len(row) >= 2:
                    # ইউজারনাম খোঁজা (সাধারণত কলাম 1)
                    username_col = 0
                    phone_col = 1
                    id_col = None
                    
                    # হেডার থাকলে কলাম আইডি চিহ্নিত করা
                    if header:
                        for i, col in enumerate(header):
                            col_lower = col.lower().strip()
                            if 'username' in col_lower or 'user' in col_lower or 'name' in col_lower:
                                username_col = i
                            elif 'phone' in col_lower or 'mobile' in col_lower or 'number' in col_lower:
                                phone_col = i
                            elif 'id' in col_lower or 'user_id' in col_lower:
                                id_col = i
                    
                    # ডাটা এক্সট্রাক্ট
                    username = row[username_col].strip().lower().lstrip('@') if len(row) > username_col else ''
                    phone = row[phone_col].strip() if len(row) > phone_col else ''
                    user_id = row[id_col].strip() if id_col is not None and len(row) > id_col else None
                    
                    if username and phone:
                        index[username] = {
                            'phone': phone,
                            'user_id': user_id,
                            'full_row': row if len(row) <= 10 else row[:10]  # প্রথম 10 কলাম
                        }
                        count += 1
                    
                    if count % 100000 == 0:
                        print(f"Indexed {count} records...", file=sys.stderr)
        
        # ইনডেক্স সেভ করা
        with open(INDEX_FILE, 'wb') as f:
            pickle.dump(index, f)
        
        print(f"Index built: {count} records", file=sys.stderr)
        return index
    except Exception as e:
        print(f"Error building index: {e}", file=sys.stderr)
        return {}

def load_index():
    """ইনডেক্স লোড করা"""
    if os.path.exists(INDEX_FILE):
        try:
            with open(INDEX_FILE, 'rb') as f:
                index = pickle.load(f)
                print(f"Index loaded: {len(index)} records", file=sys.stderr)
                return index
        except:
            return build_index()
    else:
        return build_index()

# গ্লোবাল ইনডেক্স লোড
print("Starting API Server...", file=sys.stderr)
PHONE_INDEX = load_index()
print(f"Ready with {len(PHONE_INDEX)} records", file=sys.stderr)

@app.route('/api.php')
def get_phone():
    username = request.args.get('username', '').strip().lower().lstrip('@')
    
    if not username:
        return jsonify({
            'status': 'error',
            'message': 'Username required',
            'example': '/api.php?username=john_doe',
            'usage': {
                'get': '/api.php?username=USERNAME',
                'post': 'POST to /api.php with {"username": "USERNAME"}'
            }
        })
    
    # ইউজার খোঁজা
    if username in PHONE_INDEX:
        data = PHONE_INDEX[username]
        
        # রেসপন্স তৈরি
        response = {
            'status': 'success',
            'message': 'User found',
            'data': {
                'username': username,
                'phone': data['phone']
            },
            'credit': 'Developed by Prottoy (CODING BROTHER)',
            'timestamp': datetime.now().isoformat()
        }
        
        # ID থাকলে যোগ করা
        if data.get('user_id'):
            response['data']['user_id'] = data['user_id']
        
        # অতিরিক্ত তথ্য থাকলে
        if data.get('full_row') and len(data['full_row']) > 2:
            extra = {}
            for i, val in enumerate(data['full_row'][2:], 3):
                extra[f'column_{i}'] = val
            if extra:
                response['data']['extra_fields'] = extra
        
        return jsonify(response)
    else:
        return jsonify({
            'status': 'error',
            'message': 'Username not found',
            'searched_username': username,
            'total_records': len(PHONE_INDEX)
        })

@app.route('/api/search')
def search_user():
    """আংশিক ইউজারনাম সার্চ"""
    query = request.args.get('q', '').strip().lower()
    
    if not query or len(query) < 3:
        return jsonify({
            'status': 'error',
            'message': 'Minimum 3 characters required'
        })
    
    results = []
    for username, data in PHONE_INDEX.items():
        if query in username:
            results.append({
                'username': username,
                'phone': data['phone'],
                'user_id': data.get('user_id')
            })
            if len(results) >= 20:  # ম্যাক্স ২০ রেজাল্ট
                break
    
    return jsonify({
        'status': 'success',
        'query': query,
        'count': len(results),
        'results': results
    })

@app.route('/api/stats')
def stats():
    """ডাটাবেস স্ট্যাটাস"""
    return jsonify({
        'status': 'ok',
        'total_records': len(PHONE_INDEX),
        'index_file_size_mb': round(os.path.getsize(INDEX_FILE) / 1024 / 1024, 2) if os.path.exists(INDEX_FILE) else 0,
        'csv_file_size_gb': round(os.path.getsize(CSV_FILE) / 1024 / 1024 / 1024, 2) if os.path.exists(CSV_FILE) else 0,
        'server_time': datetime.now().isoformat()
    })

@app.route('/health')
def health():
    return jsonify({
        'status': 'ok',
        'records': len(PHONE_INDEX),
        'message': 'API is running'
    })

# WSGI এর জন্য
application = app

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=False)