import 'dart:convert';
import 'dart:io' as Io;
import 'dart:io';
import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:flutter_countdown_timer/index.dart';
import 'package:lottie/lottie.dart';
import 'package:mohem_flutter_app/api/dashboard_api_client.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/lottie_consts.dart';
import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/main.dart';
import 'package:mohem_flutter_app/models/itg/advertisement.dart' as ads;
import 'package:path_provider/path_provider.dart';
import 'package:video_player/video_player.dart';

class ITGAdsScreen extends StatefulWidget {
  const ITGAdsScreen({Key? key}) : super(key: key);

  @override
  _ITGAdsScreenState createState() => _ITGAdsScreenState();
}

class _ITGAdsScreenState extends State<ITGAdsScreen> {
  late Future<VideoPlayerController> _futureController;
  late VideoPlayerController _controller;
  bool skip = false;
  bool isVideo = false;
  bool isImage = false;
  bool isAudio = false;
  String ext = '';
  late File imageFile;
  ads.Advertisement? advertisementData;
  dynamic data;
  String? masterID;
  int videoDuration = 0;

  void checkFileType() async {
    String? rFile = advertisementData!.viewAttachFileColl!.first.base64String;
    String? rFileExt = advertisementData!.viewAttachFileColl!.first.fileName;
    ext = "." + rFileExt!.split(".").last.toLowerCase();
    if (ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".gif") {
      await processImage(rFile!);
      isImage = true;
    } else {
      if (ext == ".aac") {
        isAudio = true;
      }
      isVideo = true;
      _futureController = createVideoPlayer(rFile!);
    }
    setState(() {});
  }

  Future processImage(String encodedBytes) async {
    try {
      Uint8List decodedBytes = base64Decode(encodedBytes.split("base64,").last);
      Directory appDocumentsDirectory = await getApplicationDocumentsDirectory(); // 1
      imageFile = Io.File("${appDocumentsDirectory.path}/addImage$ext");
      imageFile.writeAsBytesSync(decodedBytes);
    } catch (e) {
      logger.d(e);
    }
  }

  Future<VideoPlayerController> createVideoPlayer(String encodedBytes) async {
    try {
      Uint8List decodedBytes = base64Decode(encodedBytes.split("base64,").last);
      Directory appDocumentsDirectory = await getApplicationDocumentsDirectory(); // 1
      File file = Io.File("${appDocumentsDirectory.path}/myAdsVideo.mp4");
      file.writeAsBytesSync(decodedBytes);
      VideoPlayerController controller = VideoPlayerController.file(file);
      await controller.initialize();
      await controller.play();
      await controller.setVolume(1.0);
      await controller.setLooping(false);
      return controller;
    } catch (e) {
      return VideoPlayerController.asset("dataSource");
    }
  }

  void initTimer() {
    Future.delayed(const Duration(seconds: 5), () {
      skip = true;
      // setState(() {});
    });
  }

  @override
  void dispose() {
    if (_controller != null) _controller.dispose();
    // player.stop();
    // player.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    data = ModalRoute.of(context)!.settings.arguments;
    advertisementData ??= data["advertisement"] as ads.Advertisement;
    masterID ??= data["masterId"];
    if (advertisementData != null) {
      checkFileType();
      videoDuration = advertisementData?.durationInSeconds ?? 0;
    }
    return Scaffold(
      backgroundColor: Colors.black,
      body: Stack(
        children: [
          if (isVideo)
            FutureBuilder(
              future: _futureController,
              builder: (BuildContext context, AsyncSnapshot<Object?> snapshot) {
                if (snapshot.connectionState == ConnectionState.done && snapshot.data != null) {
                  _controller = snapshot.data as VideoPlayerController;
                  return Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Center(
                        child: isAudio
                            ? Lottie.asset(MyLottieConsts.audioPlaybackLottie)
                            : AspectRatio(
                                aspectRatio: _controller.value.aspectRatio,
                                child: VideoPlayer(_controller),
                              ),
                      ),
                      30.height,
                      CountdownTimer(
                        endTime: DateTime.now().millisecondsSinceEpoch + 1000 * videoDuration,
                        onEnd: null,
                        endWidget: "00:00:00".toText14(color: Colors.white, isBold: true),
                        textStyle: const TextStyle(color: Colors.white, fontSize: 16, letterSpacing: -0.48, fontWeight: FontWeight.bold),
                      ),
                      50.height,
                      Container(padding: const EdgeInsets.all(16), decoration: Utils.containerRadius(MyColors.white, 10), child: const Icon(Icons.thumb_up, color: MyColors.gradiantEndColor))
                          .onPress(() {
                        try {
                          DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!).then((value) {
                            logger.d(value);
                            Navigator.pop(context);
                          });
                        } catch (ex) {
                          logger.wtf(ex);
                          Utils.handleException(ex, context, null);
                        }
                      }),
                      // DefaultButton(LocaleKeys.home.tr(), () async {
                      //   DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!).then((value) {
                      //     logger.d(value);
                      //   });
                      // }).paddingOnly(left: 50, right: 50)

                      // ElevatedButton(
                      //   onPressed: () async {
                      //     // DashboardApiClient().setAdvertisementViewed(widget.addMasterId, widget.advertisement!.advertisementId!).then((value) {
                      //     //   logger.d(value);
                      //     // });
                      //   },
                      //   child: const Text("Go To Dashboard"),
                      // )
                    ],
                  );
                } else {
                  return const Center(
                    child: CircularProgressIndicator(),
                  );
                }
              },
            ),
          if (isImage)
            Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Image.file(imageFile),
                50.height,
                Container(padding: const EdgeInsets.all(16), decoration: Utils.containerRadius(MyColors.white, 10), child: const Icon(Icons.thumb_up, color: MyColors.gradiantEndColor)).onPress(
                  () {
                    try {
                      DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!).then((value) {
                        logger.d(value);
                        Navigator.pop(context);
                      });
                    } catch (ex) {
                      logger.wtf(ex);
                      Utils.handleException(ex, context, null);
                    }
                  },
                ),
              ],
            ),
        ],
      ),
    );
  }
}
