import 'dart:io';
import 'dart:typed_data';

import 'package:extended_image/extended_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_image_compress/flutter_image_compress.dart';
import 'package:logger/logger.dart';

import 'dart:ui' as ui show Image, Codec, FrameInfo;

import '../../common.dart';
import 'dart:ui' as ui show Image, Codec, FrameInfo;
import 'package:path_provider/path_provider.dart';
import 'package:http/http.dart' as http;
import 'package:path/path.dart' as path;
import 'package:image/image.dart' as img;
import 'package:path_provider/path_provider.dart';

/// 剪裁和压缩图片
/// [插件]
/// # 文件读写目录
/// path_provider: 1.4.0
/// extended_image: ^1.3.0
/// # 图片压缩
/// flutter_image_compress: ^0.7.0
/// path: ^1.6.2
/// image: ^2.0.7
/// http: ^0.12.0+1
class ExtendedImageExt extends StatefulWidget {
  final image;
  final width;
  final height;
  final fit;
  final cache;
  final quality;

  const ExtendedImageExt(this.image,
      {Key key,
      this.width,
      this.height,
      this.fit = BoxFit.cover,
      this.cache = true,
      this.quality = 10})
      : super(key: key);
  @override
  _ExtendedImageExtState createState() => _ExtendedImageExtState();
}

class _ExtendedImageExtState extends State<ExtendedImageExt>
    with SingleTickerProviderStateMixin {
  AnimationController _controller;

  /// 文件所在目录(临时或者永久)
  File _imageFile;

  /// 已经处理过的图片
  Uint8List _imageFileB;
  @override
  void initState() {
    _controller = AnimationController(
        vsync: this,
        duration: const Duration(seconds: 3),
        lowerBound: 0.0,
        upperBound: 1.0);
    super.initState();
    _fetchImage();
  }

  /// 渲染图片
  _fetchImage() async {
    // Logger().d('_fetchImage');
    final url = widget.image;
    final res = await http.get(url);
    // Logger().d(res);
    final image = img.decodeImage(res.bodyBytes);
    // Logger().d(image);
    // * 2中方式
    Directory appDocDir = await getApplicationDocumentsDirectory();
    Directory tempDir = await getTemporaryDirectory();

    String tempPath = tempDir.path; // 临时文件夹
    // String appDocPath = appDocDir.path; // 应用文件夹

    final imageFile =
        File(path.join(tempPath, Common.getRandString() + '.png')); // 保存在应用文件夹内
    await imageFile.writeAsBytes(img.encodePng(image)); // 需要使用与图片格式对应的encode方法
    _imageFile = imageFile;
    // Uint8List _imageFileOrgin = await _imageFile.readAsBytes();
    // Image.memory(fileBytes, gaplessPlayback: true,),
    // 打印各种属性以验证文件保存成功
    // print(imageFile.path);
    // print(imageFile.statSync());
    Uint8List result = await FlutterImageCompress.compressWithFile(
      _imageFile.path,
      minWidth: 750,
      minHeight: 1334,
      quality: widget.quality,
    );
    Logger().d('_imageFileB');
    _imageFileB = result;
    if (mounted) {
      setState(() {});
    }
  }

  @override
  void dispose() {
    _controller?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
        width: widget.width,
        height: widget.height,
        child: ExtendedImage.network(
          widget.image,
          fit: BoxFit.contain,
          cache: widget.cache,
          loadStateChanged: (ExtendedImageState state) {
            switch (state.extendedImageLoadState) {
              case LoadState.loading:
                _controller.reset();
                return Container(
                  width: Common.width(50),
                  height: Common.width(50),
                  child: CupertinoActivityIndicator(
                    radius: Common.width(24),
                  ),
                );
                break;
              case LoadState.completed:
                // ! 图片加载完成,这里我进行压缩
                _controller.forward();

                if (_imageFileB != null) {
                  return ExtendedImage.memory(
                    _imageFileB,
                    width: widget.width,
                    height: widget.height,
                    fit: widget.fit,
                  );
                } else {
                  return CupertinoActivityIndicator(radius: Common.width(24));
                }
                // ui.Image image = state.extendedImageInfo?.image;
                // return ExtendedRawImage(
                //   image: state.extendedImageInfo?.image,
                //   width: widget.width,
                //   height: widget.height,
                //   sourceRect: Rect.fromLTWH(0.0, 0.0, image.height.toDouble(),
                //       image.height.toDouble()),
                // );
                break;
              case LoadState.failed:
                _controller.reset();
                // remove memory cached
                state.imageProvider.evict();
                return Stack(
                  fit: StackFit.expand,
                  children: <Widget>[
                    Image.asset(
                      'asset/icon/loading.gif',
                      fit: BoxFit.fill,
                    ),
                  ],
                );
                break;
            }
            return Container();
          },
        ));
  }
}