import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import '../../../constant/links.dart';
import '../../../controller/functions/crud.dart';

class PaymentScreenMtn extends StatefulWidget {
  final double amount;
  final String invoiceNumber;
  final String mtnNumber;

  const PaymentScreenMtn({
    Key? key,
    required this.amount,
    required this.invoiceNumber,
    required this.mtnNumber,
  }) : super(key: key);

  @override
  State<PaymentScreenMtn> createState() => _PaymentScreenMtnState();
}

class _PaymentScreenMtnState extends State<PaymentScreenMtn> with SingleTickerProviderStateMixin {
  Timer? _pollingTimer;
  String _status = 'waiting'; // waiting, uploading, verifying, success, error
  final TextEditingController _proofController = TextEditingController();
  
  late AnimationController _blinkController;
  late Animation<Color?> _colorAnimation;
  late Animation<double> _shadowAnimation;

  @override
  void initState() {
    super.initState();
    _blinkController = AnimationController(duration: const Duration(milliseconds: 800), vsync: this)..repeat(reverse: true);
    _colorAnimation = ColorTween(begin: Colors.red.shade700, end: Colors.red.shade100).animate(_blinkController);
    _shadowAnimation = Tween<double>(begin: 2.0, end: 15.0).animate(CurvedAnimation(parent: _blinkController, curve: Curves.easeInOut));
    
    _startPolling();
  }

  @override
  void dispose() {
    _pollingTimer?.cancel();
    _blinkController.dispose();
    _proofController.dispose();
    super.dispose();
  }

  void _startPolling() {
    _pollingTimer = Timer.periodic(const Duration(seconds: 5), (timer) async {
      if (_status == 'success' || _status == 'verifying') return;
      try {
        final res = await CRUD().postWallet(link: AppLink.checkMtnStatus, payload: {'invoice_number': widget.invoiceNumber});
        if (res != 'failure' && res['status'] == 'success' && res['invoice_status'] == 'completed') {
          timer.cancel();
          if (mounted) setState(() => _status = 'success');
        }
      } catch (_) {}
    });
  }

  Future<void> _submitProof() async {
    if (_proofController.text.trim().isEmpty) {
      Get.snackbar('Error'.tr, 'Please paste the transfer message'.tr, backgroundColor: Colors.red);
      return;
    }
    setState(() => _status = 'verifying');
    
    try {
      final res = await CRUD().postWallet(link: AppLink.uploadMtnProof, payload: {
        'invoice_number': widget.invoiceNumber,
        'proof_text': _proofController.text.trim(),
      });
      
      if (res != 'failure' && res['status'] == 'success') {
        if (mounted) setState(() => _status = 'success');
      } else {
        if (mounted) setState(() => _status = 'error');
        Get.defaultDialog(title: 'Failed'.tr, content: Text(res['message']?.toString() ?? 'Verification failed'));
      }
    } catch (e) {
      if (mounted) setState(() => _status = 'error');
      Get.defaultDialog(title: 'Error'.tr, content: Text('Error uploading proof'.tr));
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[50],
      appBar: AppBar(title: const Text("MTN Payment"), centerTitle: true, backgroundColor: Colors.white, foregroundColor: Colors.black),
      body: SafeArea(
        child: Padding(
          padding: const EdgeInsets.all(20.0),
          child: _status == 'success' ? _buildSuccessUI() : _buildWaitingUI(),
        ),
      ),
    );
  }

  Widget _buildWaitingUI() {
    final currencyFormat = NumberFormat.decimalPattern('ar_SY');
    
    return SingleChildScrollView(
      child: Column(
        children: [
          Container(
            width: double.infinity,
            padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 15),
            decoration: BoxDecoration(gradient: LinearGradient(colors: [Colors.blue.shade800, Colors.blue.shade600]), borderRadius: BorderRadius.circular(16)),
            child: Column(
              children: [
                const Text("المبلغ المطلوب", style: TextStyle(color: Colors.white70, fontSize: 14)),
                const SizedBox(height: 5),
                Text("${currencyFormat.format(widget.amount)} ل.س", style: const TextStyle(color: Colors.white, fontSize: 28, fontWeight: FontWeight.bold)),
              ],
            ),
          ),
          const SizedBox(height: 25),
          
          AnimatedBuilder(
            animation: _blinkController,
            builder: (context, child) {
              return Container(
                padding: const EdgeInsets.all(20),
                decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(16), border: Border.all(color: _colorAnimation.value ?? Colors.red, width: 3.0), boxShadow: [BoxShadow(color: (_colorAnimation.value ?? Colors.red).withOpacity(0.4), blurRadius: _shadowAnimation.value, spreadRadius: 2)]),
                child: Column(
                  children: [
                    const Text("يرجى تحويل المبلغ إلى الرقم التالي:", textAlign: TextAlign.center, style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
                    const SizedBox(height: 15),
                    InkWell(
                      onTap: () {
                        Clipboard.setData(ClipboardData(text: widget.mtnNumber));
                        ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: const Text("تم نسخ الرقم ✅", textAlign: TextAlign.center), backgroundColor: Colors.green.shade600));
                      },
                      child: Container(
                        padding: const EdgeInsets.all(15),
                        decoration: BoxDecoration(color: Colors.blue.shade50, borderRadius: BorderRadius.circular(12), border: Border.all(color: Colors.blue.shade200)),
                        child: Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: [
                            Text(widget.mtnNumber, style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold, letterSpacing: 2.0)),
                            const Icon(Icons.copy, color: Colors.blue),
                          ],
                        ),
                      ),
                    ),
                  ],
                ),
              );
            },
          ),
          
          const SizedBox(height: 30),
          const Text("بعد إتمام التحويل، يرجى نسخ رسالة البنك النصية ولصقها هنا للتحقق التلقائي:", textAlign: TextAlign.center, style: TextStyle(fontSize: 14)),
          const SizedBox(height: 10),
          TextField(
            controller: _proofController,
            maxLines: 4,
            decoration: InputDecoration(
              hintText: "قم بلصق نص رسالة التحويل هنا...",
              border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
              filled: true,
              fillColor: Colors.white,
            ),
          ),
          const SizedBox(height: 15),
          SizedBox(
            width: double.infinity,
            height: 50,
            child: ElevatedButton(
              style: ElevatedButton.styleFrom(backgroundColor: Colors.blue.shade800, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12))),
              onPressed: _status == 'verifying' ? null : _submitProof,
              child: _status == 'verifying' 
                ? const CircularProgressIndicator(color: Colors.white) 
                : const Text("تحقق من الدفع", style: TextStyle(fontSize: 18, color: Colors.white, fontWeight: FontWeight.bold)),
            ),
          ),
          const SizedBox(height: 20),
          const Text("جاري فحص الفاتورة تلقائياً كل 5 ثوانٍ...", style: TextStyle(color: Colors.grey, fontSize: 12)),
        ],
      ),
    );
  }

  Widget _buildSuccessUI() {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        const Icon(Icons.verified_rounded, color: Colors.green, size: 100),
        const SizedBox(height: 20),
        const Text("تم الدفع بنجاح!", style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold)),
        const SizedBox(height: 40),
        SizedBox(
          width: double.infinity,
          child: ElevatedButton(
            style: ElevatedButton.styleFrom(backgroundColor: Colors.green, foregroundColor: Colors.white, padding: const EdgeInsets.symmetric(vertical: 16)),
            onPressed: () { Get.back(); Get.back(); },
            child: const Text("متابعة", style: TextStyle(fontSize: 18)),
          ),
        ),
      ],
    );
  }
}
