import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:video_player/video_player.dart';

import 'add_story.dart';

class AddStoryView extends StatelessWidget {
  final AddStoryController controller;
  const AddStoryView(this.controller, {Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final video = controller.videoPlayerController;

    return Scaffold(
      backgroundColor: Colors.blueGrey.shade900,
      appBar: AppBar(
        leading: const BackButton(color: Colors.white),
        systemOverlayStyle: SystemUiOverlayStyle.light,
        backgroundColor: Colors.transparent,
        elevation: 0,
        iconTheme: const IconThemeData(color: Colors.white),
        title: Text(
          L10n.of(context)!.addToStory,
          style: const TextStyle(
            color: Colors.white,
            shadows: [
              Shadow(
                color: Colors.black,
                offset: Offset(0, 0),
                blurRadius: 5,
              ),
            ],
          ),
        ),
        actions: [
          if (controller.hasMedia)
            IconButton(
              icon: const Icon(Icons.fullscreen_outlined),
              color: Colors.white,
              onPressed: controller.toggleBoxFit,
            ),
          if (!controller.hasMedia)
            IconButton(
              icon: const Icon(Icons.color_lens_outlined),
              color: Colors.white,
              onPressed: controller.updateColor,
            ),
          IconButton(
            icon: const Icon(Icons.delete_outlined),
            color: Colors.white,
            onPressed: controller.reset,
          ),
        ],
      ),
      extendBodyBehindAppBar: true,
      body: GestureDetector(
        onVerticalDragUpdate: controller.onVerticalDragUpdate,
        onHorizontalDragUpdate: controller.onHorizontalDragUpdate,
        child: Stack(
          children: [
            if (video != null)
              Padding(
                padding: const EdgeInsets.symmetric(vertical: 80.0),
                child: FutureBuilder(
                  future: video.initialize().then((_) => video.play()),
                  builder: (_, __) => Center(child: VideoPlayer(video)),
                ),
              ),
            AnimatedContainer(
              duration: const Duration(seconds: 1),
              padding: const EdgeInsets.symmetric(
                horizontal: 8.0,
                vertical: 80.0,
              ),
              decoration: BoxDecoration(
                image: controller.image == null
                    ? null
                    : DecorationImage(
                        image: MemoryImage(controller.image!.bytes),
                        fit: controller.fit,
                        opacity: 0.75,
                      ),
                gradient: controller.hasMedia
                    ? null
                    : LinearGradient(
                        colors: [
                          controller.backgroundColorDark,
                          controller.backgroundColor,
                        ],
                        begin: Alignment.topCenter,
                        end: Alignment.bottomCenter,
                      ),
              ),
              child: Align(
                alignment: Alignment(
                  controller.alignmentX / 100,
                  controller.alignmentY / 100,
                ),
                child: IntrinsicWidth(
                  child: TextField(
                    controller: controller.controller,
                    focusNode: controller.focusNode,
                    minLines: 1,
                    maxLines: 15,
                    autofocus: false,
                    textAlign: TextAlign.center,
                    style: TextStyle(
                      fontSize: 24,
                      color: Colors.white,
                      shadows: controller.hasMedia
                          ? const [
                              Shadow(
                                color: Colors.black,
                                offset: Offset(5, 5),
                                blurRadius: 20,
                              ),
                              Shadow(
                                color: Colors.black,
                                offset: Offset(5, 5),
                                blurRadius: 20,
                              ),
                              Shadow(
                                color: Colors.black,
                                offset: Offset(-5, -5),
                                blurRadius: 20,
                              ),
                              Shadow(
                                color: Colors.black,
                                offset: Offset(-5, -5),
                                blurRadius: 20,
                              ),
                            ]
                          : null,
                    ),
                    onChanged: controller.updateHasText,
                    decoration: InputDecoration(
                      border: InputBorder.none,
                      hintText: controller.hasMedia
                          ? L10n.of(context)!.addDescription
                          : L10n.of(context)!.whatIsGoingOn,
                      filled: false,
                      hintStyle: TextStyle(
                        color: Colors.white.withOpacity(0.5),
                        backgroundColor: Colors.transparent,
                      ),
                      enabledBorder: InputBorder.none,
                      focusedBorder: InputBorder.none,
                    ),
                  ),
                ),
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: Row(
        mainAxisSize: MainAxisSize.min,
        children: [
          if (!controller.hasMedia) ...[
            FloatingActionButton(
              onPressed: controller.importMedia,
              backgroundColor: controller.backgroundColorDark,
              foregroundColor: Colors.white,
              heroTag: null,
              child: const Icon(Icons.photo_outlined),
            ),
            const SizedBox(width: 16),
            FloatingActionButton(
              onPressed: controller.capturePhoto,
              backgroundColor: controller.backgroundColorDark,
              foregroundColor: Colors.white,
              heroTag: null,
              child: const Icon(Icons.camera_alt_outlined),
            ),
            const SizedBox(width: 16),
            FloatingActionButton(
              onPressed: controller.captureVideo,
              backgroundColor: controller.backgroundColorDark,
              foregroundColor: Colors.white,
              heroTag: null,
              child: const Icon(Icons.video_camera_front_outlined),
            ),
          ],
          if (controller.hasMedia || controller.hasText) ...[
            const SizedBox(width: 16),
            FloatingActionButton(
              onPressed: controller.postStory,
              backgroundColor: Theme.of(context).colorScheme.surface,
              foregroundColor: Theme.of(context).colorScheme.onSurface,
              child: const Icon(Icons.send_rounded),
            ),
          ],
        ],
      ),
    );
  }
}
