import axios from 'axios';
import * as crypto from 'crypto';
import { DB } from './db';
import { payments } from './schema';
import { eq } from 'drizzle-orm';

export class AiService {
  private questions = require('./constants').QUESTIONS;

  async generateResult(answers: any): Promise<string> {
    const qaText = this.questions.map((q: string, i: number) => `${i + 1}. ${q}\nپاسخ: ${answers[i]}`).join('\n\n');
    const prompt = `شما یک روانشناس متخصص در زمینه روابط زناشویی هستید. بر اساس پاسخ‌های زیر به سوالات مربوط به رفتار همسر، لطفاً تحلیل جامع و دقیقی ارائه دهید:

سوالات و پاسخ‌ها:
${qaText}

لطفاً در تحلیل خود به موارد زیر توجه کنید:
احتمال وجود خیانت (درصد)
نشانه‌های مثبت و منفی
توصیه‌های عملی
راهکارهای بهبود رابطه

پاسخ را به زبان فارسی و با لحن مشاوره‌ای و حمایتی بنویسید.
قوانین فرمت پاسخ:
هیچ کاراکتر خاصی مثل * _ [ ] ( ) ~ \` > # + - = | { } . ! استفاده نکنید
برای برجسته کردن متن از کلمات فارسی استفاده کنید
هیچ code block یا backtick استفاده نکنید
پاسخ باید مستقیماً شروع شود
فقط متن ساده فارسی بنویسید`;

    try {
      const res = await axios.post('https://openrouter.ai/api/v1/chat/completions', {
        model: 'openai/gpt-4.1', // یا مدل‌های دیگر مثل anthropic/claude-3-haiku
        messages: [{ role: 'user', content: prompt }],
      }, {
        headers: {
          'Authorization': `Bearer ${process.env.OPENROUTER_API_KEY}`,
          'Content-Type': 'application/json',
        }
      });
      return res.data.choices[0].message.content;
    } catch (e) {
      console.error('AI Error', e);
      throw new Error('AI Unavailable');
    }
  }
}

export class PaymentService {
  constructor(private db: DB) {}

  // --- پرداخت کریپتو (بدون تغییر) ---
  async createCryptoPayment(userId: number) {
    const orderId = `premium_${userId}_${Date.now()}`;
    const callbackUrl = `${process.env.APP_URL}/payment-result`;
    
    const payload = {
      price_amount: 10,
      price_currency: 'usd',
      order_id: orderId,
      order_description: 'Premium Access',
      ipn_callback_url: `${process.env.APP_URL}/api/payments/ipn`,
      success_url: `${callbackUrl}?status=success`,
      cancel_url: `${callbackUrl}?status=cancel`
    };

    const res = await axios.post('https://api.nowpayments.io/v1/invoice', payload, {
      headers: { 'x-api-key': process.env.NOWPAYMENT_API_KEY }
    });

    await this.db.insert(payments).values({
      userId, type: 'crypto', amount: 10, currency: 'usd', orderId,
      paymentUrl: res.data.invoice_url,
    });

    return { paymentUrl: res.data.invoice_url, orderId };
  }

  // --- پرداخت ریالی (اصلاح شده طبق داکیومنت جدید) ---
  async createRialPayment(userId: number) {
    // 1. محاسبه مبلغ به ریال
    const priceToman = Number(process.env.TOMAN_PRICE || 99000);
    const amountRial = priceToman * 10; // پی‌استار ریال می‌گیرد

    const orderId = `premium_${userId}_${Date.now()}`;
    const callback = `${process.env.APP_URL}/api/payments/paystar-callback`; // دامنه باید با پنل یکی باشد
    
    // 2. ساخت امضا: amount#order_id#callback
    const signData = `${amountRial}#${orderId}#${callback}`;
    const sign = crypto.createHmac('sha512', process.env.PAYSTAR_SIGN_KEY!)
      .update(signData)
      .digest('hex');

    console.log('🚀 PayStar Create Request:', { amountRial, orderId, callback });

    try {
      // 3. درخواست به آدرس جدید core.paystar.ir
      const res = await axios.post('https://core.paystar.ir/api/pardakht/create', 
        { 
          amount: amountRial, 
          order_id: orderId, 
          callback: callback, 
          sign: sign 
        }, 
        {
          headers: { 
            'Authorization': `Bearer ${process.env.PAYSTAR_TOKEN}`,
            'Content-Type': 'application/json'
          }
        }
      );

      console.log('✅ PayStar Create Response:', res.data);

      if (res.data.status !== 1) {
        throw new Error(`PayStar Error: ${res.data.message} (Status: ${res.data.status})`);
      }

      // 4. دریافت لینک پرداخت
      const token = res.data.data.token;
      const paymentUrl = `https://core.paystar.ir/api/pardakht/payment?token=${token}`;

      await this.db.insert(payments).values({ 
        userId, 
        type: 'rial', 
        amount: amountRial, 
        currency: 'irr', 
        orderId, 
        paymentUrl,
        status: 'pending' 
      });

      return { paymentUrl };

    } catch (error: any) {
      if (error.response) {
        console.error('❌ PayStar API Error:', error.response.status, error.response.data);
      } else {
        console.error('❌ PayStar Internal Error:', error.message);
      }
      throw error;
    }
  }

  // --- متد جدید برای وریفای تراکنش ---
  async verifyRialPayment(refNum: string, amountRial: number, cardNumber: string, trackingCode: string) {
    // ساخت امضا برای وریفای: amount#ref_num#card_number#tracking_code
    // طبق داکیومنت: amount#ref_num#card_number#tracking_code
    const signData = `${amountRial}#${refNum}#${cardNumber}#${trackingCode}`;
    const sign = crypto.createHmac('sha512', process.env.PAYSTAR_SIGN_KEY!)
      .update(signData)
      .digest('hex');

    console.log('🚀 Verifying PayStar Trans:', { refNum, amountRial });

    try {
      const res = await axios.post('https://core.paystar.ir/api/pardakht/verify', 
        {
          ref_num: refNum,
          amount: amountRial,
          sign: sign
        },
        {
          headers: { 
            'Authorization': `Bearer ${process.env.PAYSTAR_TOKEN}`,
            'Content-Type': 'application/json'
          }
        }
      );

      console.log('✅ Verify Response:', res.data);
      return res.data;
    } catch (error: any) {
      console.error('❌ Verify Error:', error.response?.data || error.message);
      throw error;
    }
  }

  // --- وریفای IPN (کریپتو) ---
  verifyIpnSignature(payload: any, signature: string) {
    const hmac = crypto.createHmac('sha512', process.env.NOWPAYMENT_IPN_SECRET!);
    hmac.update(JSON.stringify(payload));
    return hmac.digest('hex') === signature;
  }
}