import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flux/core/utils/extensions.dart';
import 'package:flux/core/widgets/image_upload/blocs/image_upload_cubit.dart';
import 'package:flux/features/attachments/blocs/attachments_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:image_picker/image_picker.dart';

class ImageUploadScreen extends StatelessWidget {
  final String title;
  final String companyId;

  const ImageUploadScreen({
    super.key,
    required this.title,
    required this.companyId,
  });

  bool _isImage(String path) {
    return ['jpg', 'jpeg', 'png', 'webp'].contains(path.fileExtension());
  }

  @override
  Widget build(BuildContext context) {
    return BlocBuilder<ImageUploadCubit, ImageUploadState>(
      builder: (context, state) {
        return BlocListener<AttachmentsBloc, AttachmentsState>(
          listener: (context, attachmentState) {
            if (attachmentState.status == AttachmentsStatus.success &&
                state.status == ImageUploadStatus.uploading) {
              if (Navigator.of(context).canPop()) {
                ScaffoldMessenger.of(context).showSnackBar(
                  const SnackBar(
                    content: Text("File caricati con successo! ✅"),
                  ),
                );
                Navigator.of(context).pop();
              } else {
                context.go('/upload-success');
              }
            }
            if (attachmentState.status == AttachmentsStatus.failure) {
              context.read<ImageUploadCubit>().setError(attachmentState.error);
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(content: Text("Errore: ${state.errorMessage}")),
              );
            }
          },
          child: Scaffold(
            appBar: AppBar(
              title: Text('Upload: $title'),
              automaticallyImplyLeading:
                  state.status != ImageUploadStatus.uploading,
            ),
            body: Stack(
              children: [
                Column(
                  children: [
                    // --- SEZIONE PULSANTI (Fotocamera / Galleria) ---
                    Padding(
                      padding: const EdgeInsets.all(16.0),
                      child: Row(
                        children: [
                          Expanded(
                            child: ElevatedButton.icon(
                              onPressed:
                                  state.status == ImageUploadStatus.uploading
                                  ? null
                                  : () => _handleCamera(context),
                              icon: const Icon(Icons.camera_alt),
                              label: const Text('SCATTA'),
                              style: ElevatedButton.styleFrom(
                                padding: const EdgeInsets.symmetric(
                                  vertical: 16,
                                ),
                              ),
                            ),
                          ),
                          Expanded(
                            child: OutlinedButton.icon(
                              onPressed:
                                  state.status == ImageUploadStatus.uploading
                                  ? null
                                  : () => _handleFilePicker(context),
                              icon: const Icon(Icons.folder),
                              label: const Text("GALLERIA"),
                              style: OutlinedButton.styleFrom(
                                padding: const EdgeInsets.symmetric(
                                  vertical: 16,
                                ),
                              ),
                            ),
                          ),
                        ],
                      ),
                    ),

                    const Divider(),

                    // --- SEZIONE ANTEPRIME (La GridView Magica) ---
                    Expanded(
                      child: state.stagedFiles.isEmpty
                          ? const Center(
                              child: Text(
                                "Nessun file selezionato.\nScatta una foto o scegli dalla galleria.",
                                textAlign: TextAlign.center,
                                style: TextStyle(color: Colors.grey),
                              ),
                            )
                          : GridView.builder(
                              padding: const EdgeInsets.all(16),
                              gridDelegate:
                                  const SliverGridDelegateWithFixedCrossAxisCount(
                                    crossAxisCount:
                                        3, // 3 colonne stile galleria
                                    crossAxisSpacing: 12,
                                    mainAxisSpacing: 12,
                                  ),
                              itemCount: state.stagedFiles.length,
                              itemBuilder: (context, index) {
                                final file = state.stagedFiles[index];
                                final isImg = _isImage(file.name);
                                if (file.bytes == null) {
                                  return Container(
                                    width: double.infinity,
                                    height: double.infinity,
                                    decoration: BoxDecoration(
                                      color: Colors.grey.shade200,
                                      borderRadius: BorderRadius.circular(12),
                                      border: Border.all(
                                        color: Colors.grey.shade300,
                                      ),
                                    ),
                                    child: ClipRRect(
                                      borderRadius: BorderRadius.circular(12),
                                      child: const Center(
                                        child: CircularProgressIndicator(
                                          color: Colors.blue,
                                        ),
                                      ),
                                    ),
                                  );
                                }
                                return Stack(
                                  clipBehavior: Clip.none,
                                  children: [
                                    // L'ANTEPRIMA
                                    Container(
                                      width: double.infinity,
                                      height: double.infinity,
                                      decoration: BoxDecoration(
                                        color: Colors.grey.shade200,
                                        borderRadius: BorderRadius.circular(12),
                                        border: Border.all(
                                          color: Colors.grey.shade300,
                                        ),
                                      ),
                                      child: ClipRRect(
                                        borderRadius: BorderRadius.circular(12),
                                        child: isImg
                                            ? (file.bytes != null
                                                  // Se abbiamo i bytes (es. scatto da fotocamera) usiamo quelli (a prova di Web!)
                                                  ? Image.memory(
                                                      file.bytes!,
                                                      fit: BoxFit.cover,
                                                    )
                                                  // Altrimenti andiamo di file fisico
                                                  : const Center(
                                                      child:
                                                          CircularProgressIndicator(
                                                            color: Colors.blue,
                                                          ),
                                                    ))
                                            : const Column(
                                                mainAxisAlignment:
                                                    MainAxisAlignment.center,
                                                children: [
                                                  Icon(
                                                    Icons.picture_as_pdf,
                                                    color: Colors.red,
                                                    size: 36,
                                                  ),
                                                  SizedBox(height: 4),
                                                  Text(
                                                    "PDF",
                                                    style: TextStyle(
                                                      fontSize: 10,
                                                      fontWeight:
                                                          FontWeight.bold,
                                                    ),
                                                  ),
                                                ],
                                              ),
                                      ),
                                    ),

                                    // IL PULSANTE CESTINO (In alto a destra)
                                    Positioned(
                                      top: -8,
                                      right: -8,
                                      child: GestureDetector(
                                        onTap: () => context
                                            .read<ImageUploadCubit>()
                                            .removeFile(file),
                                        child: Container(
                                          padding: const EdgeInsets.all(4),
                                          decoration: const BoxDecoration(
                                            color: Colors.red,
                                            shape: BoxShape.circle,
                                          ),
                                          child: const Icon(
                                            Icons.close,
                                            color: Colors.white,
                                            size: 16,
                                          ),
                                        ),
                                      ),
                                    ),
                                  ],
                                );
                              },
                            ),
                    ),
                    // --- SEZIONE INVIA E CHIUDI ---
                    SafeArea(
                      child: Padding(
                        padding: const EdgeInsets.all(16.0),
                        child: SizedBox(
                          width: double.infinity,
                          height: 56,
                          child: ElevatedButton.icon(
                            // Il pulsante si accende SOLO se ci sono file nel carrello
                            onPressed:
                                state.stagedFiles.isEmpty ||
                                    state.status == ImageUploadStatus.uploading
                                ? null
                                : () => _submitAllFiles(context),
                            icon: const Icon(Icons.cloud_upload),
                            label: Text(
                              "INVIA ${state.stagedFiles.length} FILE E CHIUDI",
                              style: const TextStyle(
                                fontSize: 16,
                                fontWeight: FontWeight.bold,
                              ),
                            ),
                            style: ElevatedButton.styleFrom(
                              backgroundColor: Theme.of(
                                context,
                              ).colorScheme.primary,
                              foregroundColor: Theme.of(
                                context,
                              ).colorScheme.onPrimary,
                            ),
                          ),
                        ),
                      ),
                    ),
                  ],
                ),
              ],
            ),
          ),
        );
      },
    );
  }

  // --- LOGICA FOTOCAMERA E LIBRERIA ---
  Future<void> _handleCamera(BuildContext context) async {
    final ImageUploadCubit imageUploadCubit = context.read<ImageUploadCubit>();

    final picker = ImagePicker();
    final photo = await picker.pickImage(source: ImageSource.camera);

    if (photo != null) {
      imageUploadCubit.addPhoto(photo);
    }
  }

  Future<void> _handleFilePicker(BuildContext context) async {
    final ImageUploadCubit imageUploadCubit = context.read<ImageUploadCubit>();
    final result = await FilePicker.pickFiles(
      allowMultiple: true,
      withData: true,
    );
    if (result != null) {
      imageUploadCubit.addFiles(result.files);
    }
  }

  // --- LOGICA DI INVIO AL BLoC ---
  void _submitAllFiles(BuildContext context) {
    final ImageUploadCubit imageUploadCubit = context.read<ImageUploadCubit>();

    imageUploadCubit.setStatus(ImageUploadStatus.uploading);

    // Lanciamo l'evento del nostro nuovo AttachmentsBloc Agnostico!
    context.read<AttachmentsBloc>().add(
      UploadAttachmentsEvent(
        pickedFiles: imageUploadCubit.state.stagedFiles,
        companyId: companyId,
      ),
    );
  }
}
