import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:material_symbols_icons/material_symbols_icons.dart';
import 'package:shimmer/shimmer.dart';
import 'package:kmobile/data/models/transaction.dart';
import 'package:kmobile/data/repositories/transaction_repository.dart';
import 'package:kmobile/di/injection.dart';
import '../../../l10n/app_localizations.dart';
import 'transaction_details_screen.dart';
import 'package:pdf/widgets.dart' as pw;
import 'package:permission_handler/permission_handler.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:path_provider/path_provider.dart';
import 'package:share_plus/share_plus.dart';

class AccountStatementScreen extends StatefulWidget {
  final String accountNo;
  final String balance;
  final String accountType;
  const AccountStatementScreen({
    super.key,
    required this.accountNo,
    required this.balance,
    required this.accountType,
  });

  @override
  State<AccountStatementScreen> createState() => _AccountStatementScreen();
}

class _AccountStatementScreen extends State<AccountStatementScreen> {
  DateTime? fromDate;
  DateTime? toDate;
  bool _txLoading = true;
  List<Transaction> _transactions = [];
  final _minAmountController = TextEditingController();
  final _maxAmountController = TextEditingController();
  //Future<Map<String, dynamic>?>? accountStatementsFuture;

  @override
  void initState() {
    super.initState();
    _loadTransactions();
  }

  Future<void> _loadTransactions() async {
    setState(() {
      _txLoading = true;
      _transactions = [];
    });
    try {
      final repo = getIt<TransactionRepository>();
      final txs = await repo.fetchTransactions(
        widget.accountNo,
        fromDate: fromDate,
        toDate: toDate,
      );
      setState(() => _transactions = txs);
    } catch (e) {
      if (!mounted) return;
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text(
            '${AppLocalizations.of(context).failedToLoadTransactions} $e',
          ),
        ),
      );
    } finally {
      setState(() => _txLoading = false);
    }
  }

  Future<void> _selectFromDate(BuildContext context) async {
    final now = DateTime.now();
    final picked = await showDatePicker(
      context: context,
      initialDate: fromDate ?? now,
      firstDate: DateTime(2020),
      lastDate: now,
    );
    if (picked != null) {
      setState(() {
        fromDate = picked;
        toDate = null;
      });
    }
  }

  Future<void> _selectToDate(BuildContext context) async {
    if (fromDate == null) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text(AppLocalizations.of(context).pleaseSelectDateFirst),
        ),
      );
      return;
    }
    final now = DateTime.now();
    final maxToDate = fromDate!.add(const Duration(days: 31)).isBefore(now)
        ? fromDate!.add(const Duration(days: 31))
        : now;
    final picked = await showDatePicker(
      context: context,
      initialDate: toDate ?? fromDate!,
      firstDate: fromDate!,
      lastDate: maxToDate,
    );
    if (picked != null) {
      setState(() => toDate = picked);
    }
  }

  String _formatDate(DateTime date) {
    return "${date.day.toString().padLeft(2, '0')}-"
        "${date.month.toString().padLeft(2, '0')}-"
        "${date.year}";
  }

  @override
  void dispose() {
    _minAmountController.dispose();
    _maxAmountController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(
          AppLocalizations.of(context).accountStatement,
        ),
        centerTitle: false,
      ),
      body: Padding(
        padding: const EdgeInsets.all(12.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Row(
              children: [
                Text(
                  "${AppLocalizations.of(context).accountNumber}: ",
                  style: const TextStyle(
                    fontSize: 17,
                    fontWeight: FontWeight.bold,
                  ),
                ),
                Text(widget.accountNo, style: const TextStyle(fontSize: 17)),
              ],
            ),
            const SizedBox(height: 15),
            Row(
              children: [
                Text(
                  "${AppLocalizations.of(context).availableBalance}: ",
                  style: const TextStyle(
                    fontSize: 17,
                  ),
                ),
                Text(' ₹ ${widget.balance}',
                    style: const TextStyle(fontSize: 17)),
              ],
            ),
            const SizedBox(height: 15),
            Text(
              AppLocalizations.of(context).filters,
              style: const TextStyle(fontSize: 17),
            ),
            const SizedBox(height: 15),
            Row(
              children: [
                Expanded(
                  child: GestureDetector(
                    onTap: () => _selectFromDate(context),
                    child: buildDateBox(
                      AppLocalizations.of(context).fromDate,
                      fromDate,
                    ),
                  ),
                ),
                const SizedBox(width: 10),
                Expanded(
                  child: GestureDetector(
                    onTap: () => _selectToDate(context),
                    child: buildDateBox(
                      AppLocalizations.of(context).toDate,
                      toDate,
                    ),
                  ),
                ),
              ],
            ),
            const SizedBox(height: 20),
            SizedBox(
              width: double.infinity,
              child: ElevatedButton(
                onPressed: _loadTransactions,
                style: ElevatedButton.styleFrom(
                  backgroundColor:
                      Theme.of(context).colorScheme.primaryContainer,
                  padding: const EdgeInsets.symmetric(vertical: 16),
                ),
                child: Text(
                  AppLocalizations.of(context).search,
                  style: TextStyle(
                    color: Theme.of(context).colorScheme.onPrimaryContainer,
                    fontSize: 16,
                  ),
                ),
              ),
            ),
            const SizedBox(height: 15),
            if (!_txLoading &&
                _transactions.isNotEmpty &&
                fromDate == null &&
                toDate == null)
              Padding(
                padding: const EdgeInsets.only(bottom: 12.0),
                child: Text(
                  AppLocalizations.of(context).lastTenTransactions,
                  style: TextStyle(
                    fontSize: 16,
                    fontWeight: FontWeight.w500,
                    color: Theme.of(context).colorScheme.onSurfaceVariant,
                  ),
                ),
              ),
            Expanded(
              child: _txLoading
                  ? ListView.builder(
                      itemCount: 3,
                      itemBuilder: (_, __) => ListTile(
                        leading: Shimmer.fromColors(
                          baseColor: Colors.grey[300]!,
                          highlightColor: Colors.grey[100]!,
                          child: CircleAvatar(
                            radius: 12,
                            backgroundColor:
                                Theme.of(context).scaffoldBackgroundColor,
                          ),
                        ),
                        title: Shimmer.fromColors(
                          baseColor: Colors.grey[300]!,
                          highlightColor: Colors.grey[100]!,
                          child: Container(
                            height: 10,
                            width: 100,
                            color: Theme.of(context).scaffoldBackgroundColor,
                          ),
                        ),
                        subtitle: Shimmer.fromColors(
                          baseColor: Colors.grey[300]!,
                          highlightColor: Colors.grey[100]!,
                          child: Container(
                            height: 8,
                            width: 60,
                            color: Theme.of(context).scaffoldBackgroundColor,
                          ),
                        ),
                      ),
                    )
                  : _transactions.isEmpty
                      ? Center(
                          child: Text(
                              AppLocalizations.of(context).noTransactions,
                              style: TextStyle(
                                fontSize: 16,
                                color: Theme.of(context).colorScheme.onSurface,
                              )),
                        )
                      : ListView.separated(
                          itemCount: _transactions.length,
                          itemBuilder: (context, index) {
                            final tx = _transactions[index];
                            return ListTile(
                              leading: Icon(
                                tx.type == 'CR'
                                    ? Symbols.call_received
                                    : Symbols.call_made,
                                color: tx.type == 'CR'
                                    ? Colors.green
                                    : Theme.of(context).colorScheme.error,
                              ),
                              title: Text(
                                tx.date ?? '',
                                style: const TextStyle(fontSize: 15),
                              ),
                              subtitle: Text(
                                tx.name != null
                                    ? (tx.name!.length > 22
                                        ? tx.name!.substring(0, 22)
                                        : tx.name!)
                                    : '',
                                style: const TextStyle(fontSize: 12),
                              ),
                              trailing: Column(
                                crossAxisAlignment: CrossAxisAlignment.end,
                                mainAxisAlignment: MainAxisAlignment.center,
                                children: [
                                  Text(
                                    "₹${tx.amount}",
                                    style: const TextStyle(fontSize: 17),
                                  ),
                                  Text(
                                    "Bal: ₹${tx.balance}",
                                    style: const TextStyle(
                                        fontSize: 12), // Style matches tx.name
                                  ),
                                ],
                              ),
                              onTap: () {
                                Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                    builder: (_) => TransactionDetailsScreen(
                                        transaction: tx),
                                  ),
                                );
                              },
                            );
                          },
                          separatorBuilder: (context, index) {
                            return const Divider();
                          },
                        ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _exportToPdf();
        },
        child: const Icon(Icons.download),
      ),
    );
  }

  Future<void> _exportToPdf() async {
    // Step 1: Check if there are any transactions to export.
    if (_transactions.isEmpty) {
      if (mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(
            content: Text('No transactions to export.'),
          ),
        );
      }
      return;
    }

    var logo = await rootBundle.load('assets/images/logo.png');
    var rubik = await rootBundle.load("assets/fonts/Rubik-Regular.ttf");
    final pdf = pw.Document();

    pdf.addPage(pw.MultiPage(
        margin: const pw.EdgeInsets.all(20),
        build: (pw.Context context) {
          return [
            pw.Row(
                mainAxisAlignment: pw.MainAxisAlignment.start,
                crossAxisAlignment: pw.CrossAxisAlignment.center,
                children: [
                  pw.Image(pw.MemoryImage(logo.buffer.asUint8List()),
                      width: 50, height: 50),
                  pw.SizedBox(width: 20),
                  pw.Text('Account Statement - KCCB',
                      style: pw.TextStyle(
                          fontSize: 24, fontWeight: pw.FontWeight.bold)),
                ]),
            pw.SizedBox(height: 20),
            pw.Row(
                mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
                children: [
                  pw.Text('Account Number: ${widget.accountNo}',
                      style:
                          pw.TextStyle(font: pw.Font.ttf(rubik), fontSize: 15)),
                  pw.Text('Account Type: ${widget.accountType}',
                      style: pw.TextStyle(
                        fontSize: 15,
                        font: pw.Font.ttf(rubik),
                      )),
                ]),
            pw.SizedBox(height: 20),
            pw.Table(border: pw.TableBorder.all(), columnWidths: {
              0: const pw.FractionColumnWidth(0.2),
              1: const pw.FractionColumnWidth(0.45),
              2: const pw.FractionColumnWidth(0.15),
              3: const pw.FractionColumnWidth(0.20),
            }, children: [
              pw.TableRow(
                children: [
                  pw.Padding(
                      padding: const pw.EdgeInsets.all(4),
                      child: pw.Text('Date')),
                  pw.Padding(
                      padding: const pw.EdgeInsets.all(4),
                      child: pw.Text('Description', softWrap: true)),
                  pw.Padding(
                      padding: const pw.EdgeInsets.all(4),
                      child: pw.Text('Amount')),
                  pw.Padding(
                      padding: const pw.EdgeInsets.all(4),
                      child: pw.Text('Balance')),
                ],
              ),
              ..._transactions.map<pw.TableRow>((tx) {
                return pw.TableRow(children: [
                  pw.Padding(
                      padding: const pw.EdgeInsets.all(10),
                      child: pw.Text(tx.date ?? '',
                          style: pw.TextStyle(
                            fontSize: 12,
                            font: pw.Font.ttf(rubik),
                          ))),
                  pw.Padding(
                      padding: const pw.EdgeInsets.all(10),
                      child: pw.Text(tx.name ?? '',
                          style: pw.TextStyle(
                              fontSize: 12, font: pw.Font.ttf(rubik)))),
                  pw.Padding(
                      padding: const pw.EdgeInsets.all(10),
                      child: pw.Text("₹${tx.amount} ${tx.type}",
                          style: pw.TextStyle(
                            fontSize: 12,
                            font: pw.Font.ttf(rubik),
                          ))),
                  pw.Padding(
                      padding: const pw.EdgeInsets.all(10),
                      child: pw.Text("₹${tx.balance} ${tx.balanceType}",
                          style: pw.TextStyle(
                            fontSize: 12,
                            font: pw.Font.ttf(rubik),
                          ))),
                ]);
              }),
            ])
          ];
        },
        footer: (pw.Context context) {
          return pw.Container(
            alignment: pw.Alignment.centerRight,
            margin: const pw.EdgeInsets.only(top: 10),
            child: pw.Text(
              'Kangra Central Co-Operative Bank Pvt Ltd. ©. All rights reserved.',
              style: pw.TextStyle(
                font: pw.Font.ttf(rubik),
                fontSize: 8,
              ),
            ),
          );
        }));

    //Logic For all platforms
    try {
      final Uint8List pdfBytes = await pdf.save();
      final String timestamp = DateTime.now().millisecondsSinceEpoch.toString();
      final String fileName = 'account_statement_$timestamp.pdf';

      // For Android
      if (Platform.isAndroid) {
        final androidInfo = await DeviceInfoPlugin().androidInfo;
        if (androidInfo.version.sdkInt < 29) {
          final status = await Permission.storage.status;
          if (status.isDenied) {
            final result = await Permission.storage.request();
            if (result.isDenied) {
              if (mounted) {
                ScaffoldMessenger.of(context).showSnackBar(
                  const SnackBar(
                    content: Text('Storage permission is required to save PDF'),
                  ),
                );
              }
              return;
            }
          }
        }

        final directory = Directory('/storage/emulated/0/Download');
        final file = File('${directory.path}/$fileName');
        await file.writeAsBytes(pdfBytes);

        if (mounted) {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(
              content: Text('PDF saved to: ${file.path}'),
            ),
          );
        }
      }
      // Add for IOS
      else if (Platform.isIOS) {
        // On iOS, we save to a temporary directory and then open the share sheet.
        final tempDir = await getTemporaryDirectory();
        final file = await File('${tempDir.path}/$fileName').create();
        await file.writeAsBytes(pdfBytes);

        // Use share_plus to open the iOS share dialog
        await Share.shareXFiles(
          [XFile(file.path)],
        );
      }
    } catch (e) {
      if (mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text('Error saving PDF: $e'),
          ),
        );
      }
    }
  }

  Widget buildDateBox(String label, DateTime? date) {
    return Container(
      padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 16),
      decoration: BoxDecoration(
        border:
            Border.all(color: Theme.of(context).colorScheme.onSurfaceVariant),
        borderRadius: BorderRadius.circular(6),
      ),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          Text(
            date != null ? _formatDate(date) : label,
            style: TextStyle(
              fontSize: 16,
              color: date != null
                  ? Theme.of(context).colorScheme.onSurface
                  : Theme.of(context).colorScheme.onSurfaceVariant,
            ),
          ),
          const Icon(Icons.arrow_drop_down),
        ],
      ),
    );
  }
}
