#!/usr/bin/python3
# -*- coding: utf-8 -*-

import json
import logging
import sys
import os
import requests
import time
import socket

# تنظیمات
socket.setdefaulttimeout(30)

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
logger = logging.getLogger(__name__)

class RubikaBot:
    def __init__(self):
        self.auth_data = {}
        # لیست IP های احتمالی روبیکا
        self.ips = [
            "185.202.4.100",
            "185.202.4.101", 
            "185.202.4.102",
            "5.202.100.100",
            "5.202.100.101"
        ]
        self.base_url = None
        self.load_auth()
        self.find_working_ip()
        
    def find_working_ip(self):
        """پیدا کردن IP که پاسخ میده"""
        for ip in self.ips:
            try:
                url = f"http://{ip}/api/"
                response = requests.get(url, timeout=5)
                if response.status_code == 200:
                    self.base_url = f"http://{ip}"
                    logger.info(f"✅ IP پیدا شد: {ip}")
                    return True
            except:
                continue
        # اگر هیچ IP ای کار نکرد، از دامنه استفاده کن
        self.base_url = "https://messenger.rubika.ir"
        logger.info("⚠️ از دامنه اصلی استفاده میشود")
        return False
        
    def load_auth(self):
        auth_file = '/var/www/html/bot/auth.json'
        if os.path.exists(auth_file):
            try:
                with open(auth_file, 'r') as f:
                    self.auth_data = json.load(f)
            except:
                self.auth_data = {}
            
    def save_auth(self):
        auth_file = '/var/www/html/bot/auth.json'
        try:
            with open(auth_file, 'w') as f:
                json.dump(self.auth_data, f)
            return True
        except:
            return False

    def send_code(self, phone):
        try:
            if not self.base_url:
                return json.dumps({'success': False, 'error': 'اتصال به روبیکا ممکن نیست'})
            
            url = f"{self.base_url}/api/sendCode"
            payload = {"phone": phone}
            headers = {
                "Content-Type": "application/json",
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
            }
            
            response = requests.post(url, json=payload, headers=headers, timeout=30)
            result = response.json()
            
            if response.status_code == 200:
                self.auth_data['phone'] = phone
                self.auth_data['state'] = 'waiting_code'
                self.save_auth()
                return json.dumps({'success': True, 'message': 'کد ارسال شد', 'data': result})
            else:
                return json.dumps({'success': False, 'error': 'خطا', 'details': result})
        except Exception as e:
            return json.dumps({'success': False, 'error': str(e)})

    def verify_code(self, code):
        try:
            if not self.base_url:
                return json.dumps({'success': False, 'error': 'اتصال به روبیکا ممکن نیست'})
            
            url = f"{self.base_url}/api/verifyCode"
            payload = {"phone": self.auth_data.get('phone'), "code": code}
            headers = {
                "Content-Type": "application/json",
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
            }
            
            response = requests.post(url, json=payload, headers=headers, timeout=30)
            result = response.json()
            
            if response.status_code == 200:
                self.auth_data['state'] = 'verified'
                self.auth_data['token'] = result.get('data', {}).get('access_token')
                self.save_auth()
                return json.dumps({'success': True, 'message': 'تایید شد', 'data': result})
            else:
                return json.dumps({'success': False, 'error': 'کد نامعتبر', 'details': result})
        except Exception as e:
            return json.dumps({'success': False, 'error': str(e)})

    def send_message(self, chat_id, text):
        try:
            if 'token' not in self.auth_data:
                return json.dumps({'success': False, 'error': 'احراز هویت نشده'})
            
            if not self.base_url:
                return json.dumps({'success': False, 'error': 'اتصال به روبیکا ممکن نیست'})
            
            url = f"{self.base_url}/api/sendMessage"
            payload = {
                "chat_id": chat_id,
                "text": text,
                "access_token": self.auth_data.get('token')
            }
            headers = {
                "Content-Type": "application/json",
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
            }
            
            response = requests.post(url, json=payload, headers=headers, timeout=30)
            result = response.json()
            
            if response.status_code == 200:
                return json.dumps({'success': True, 'message': 'پیام ارسال شد', 'data': result})
            else:
                return json.dumps({'success': False, 'error': 'خطا', 'details': result})
        except Exception as e:
            return json.dumps({'success': False, 'error': str(e)})

    def broadcast_message(self, chat_ids, text):
        results = []
        success_count = 0
        for chat_id in chat_ids:
            result = self.send_message(chat_id, text)
            data = json.loads(result)
            results.append({'chat_id': chat_id, 'success': data.get('success')})
            if data.get('success'):
                success_count += 1
            time.sleep(2)
        return json.dumps({
            'success': True,
            'message': f'ارسال به {success_count} از {len(chat_ids)}',
            'data': {'total': len(chat_ids), 'success': success_count, 'details': results}
        })

def main():
    bot = RubikaBot()
    if len(sys.argv) < 2:
        print(json.dumps({'success': False, 'error': 'دستور نامعتبر'}))
        return
    command = sys.argv[1]
    if command == 'send_code' and len(sys.argv) >= 3:
        print(bot.send_code(sys.argv[2]))
    elif command == 'verify_code' and len(sys.argv) >= 3:
        print(bot.verify_code(sys.argv[2]))
    elif command == 'send_message' and len(sys.argv) >= 4:
        print(bot.send_message(sys.argv[2], ' '.join(sys.argv[3:])))
    elif command == 'broadcast' and len(sys.argv) >= 4:
        print(bot.broadcast_message(sys.argv[2].split(','), ' '.join(sys.argv[3:])))
    else:
        print(json.dumps({'success': False, 'error': 'پارامتر نامعتبر'}))

if __name__ == '__main__':
    main()
