import "package:inventree/api.dart";
import "package:inventree/app_colors.dart";
import "package:inventree/settings/release.dart";

import "package:flutter/material.dart";
import "package:flutter/services.dart";
import "package:flutter_tabler_icons/flutter_tabler_icons.dart";
import "package:package_info_plus/package_info_plus.dart";

import "package:inventree/l10.dart";
import "package:url_launcher/url_launcher.dart";

class InvenTreeAboutWidget extends StatelessWidget {

  const InvenTreeAboutWidget(this.info) : super();

  final PackageInfo info;

  Future <void> _releaseNotes(BuildContext context) async {

    // Load release notes from external file
    String notes = await rootBundle.loadString("assets/release_notes.md");

    Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => ReleaseNotesWidget(notes))
    );
  }

  Future <void> _credits(BuildContext context) async {

    String notes = await rootBundle.loadString("assets/credits.md");

    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => CreditsWidget(notes))
    );
  }

  Future <void> _openDocs() async {

    var docsUrl = Uri(
        scheme: "https",
        host: "docs.inventree.org",
        path: "en/latest/app/app/");

    if (await canLaunchUrl(docsUrl)) {
      await launchUrl(docsUrl);
    }
  }

  Future <void> _reportBug(BuildContext context) async {

    var url = Uri(
        scheme: "https",
        host: "github.com",
        path: "inventree/inventree-app/issues/new?title=Enter+bug+description");

    if (await canLaunchUrl(url)) {
      await launchUrl(url);
    }
  }

  Future <void> _translate() async {
    var url = Uri(
        scheme: "https",
        host: "crowdin.com",
        path: "/project/inventree");

    if (await canLaunchUrl(url)) {
      await launchUrl(url);
    }
  }

  @override
  Widget build(BuildContext context) {

    List<Widget> tiles = [];

    tiles.add(
      ListTile(
        title: Text(
          L10().serverDetails,
          style: TextStyle(fontWeight: FontWeight.bold),
        ),
      )
    );

    if (InvenTreeAPI().isConnected()) {
      tiles.add(
          ListTile(
            title: Text(L10().address),
            subtitle: Text(InvenTreeAPI().baseUrl.isNotEmpty ? InvenTreeAPI().baseUrl : L10().notConnected),
            leading: Icon(TablerIcons.globe),
            trailing: InvenTreeAPI().isConnected() ? Icon(TablerIcons.circle_check, color: COLOR_SUCCESS) : Icon(TablerIcons.circle_x, color: COLOR_DANGER),
          )
      );

      tiles.add(
        ListTile(
          title: Text(L10().username),
          subtitle: Text(InvenTreeAPI().username),
          leading: InvenTreeAPI().username.isNotEmpty ? Icon(TablerIcons.user) : Icon(TablerIcons.user_cancel, color: COLOR_DANGER),
        )
      );

      tiles.add(
        ListTile(
          title: Text(L10().version),
          subtitle: Text(InvenTreeAPI().serverVersion.isNotEmpty ? InvenTreeAPI().serverVersion : L10().notConnected),
          leading: Icon(TablerIcons.info_circle),
        )
      );

      tiles.add(
        ListTile(
          title: Text(L10().serverInstance),
          subtitle: Text(InvenTreeAPI().serverInstance.isNotEmpty ? InvenTreeAPI().serverInstance : L10().notConnected),
          leading: Icon(TablerIcons.server),
        )
      );

      // Display extra tile if the server supports plugins
      tiles.add(
        ListTile(
          title: Text(L10().pluginSupport),
          subtitle: Text(L10().pluginSupportDetail),
          leading: Icon(TablerIcons.plug),
        )
      );

    } else {
      tiles.add(
        ListTile(
          title: Text(L10().notConnected),
          subtitle: Text(
            L10().serverNotConnected,
            style: TextStyle(fontStyle: FontStyle.italic),
          ),
          leading: Icon(TablerIcons.exclamation_circle)
        )
      );
    }

    tiles.add(
      ListTile(
        title: Text(
          L10().appDetails,
          style: TextStyle(fontWeight: FontWeight.bold),
        ),
      )
    );

    tiles.add(
      ListTile(
        title: Text(L10().packageName),
        subtitle: Text("${info.packageName}"),
        leading: Icon(TablerIcons.box)
      )
    );

    tiles.add(
      ListTile(
        title: Text(L10().version),
        subtitle: Text("${info.version} - Build ${info.buildNumber}"),
        leading: Icon(TablerIcons.info_circle)
      )
    );

    tiles.add(
      ListTile(
        title: Text(L10().releaseNotes),
        subtitle: Text(L10().appReleaseNotes),
        leading: Icon(TablerIcons.file, color: COLOR_ACTION),
        onTap: () {
          _releaseNotes(context);
        },
      )
    );

    tiles.add(
      ListTile(
        title: Text(L10().credits),
        subtitle: Text(L10().appCredits),
        leading: Icon(TablerIcons.balloon, color: COLOR_ACTION),
        onTap: () {
          _credits(context);
        }
      )
    );

    tiles.add(
      ListTile(
        title: Text(L10().documentation),
        subtitle: Text("https://docs.inventree.org/app"),
        leading: Icon(TablerIcons.book, color: COLOR_ACTION),
        onTap: () {
          _openDocs();
        },
      )
    );

    tiles.add(
      ListTile(
        title: Text(L10().translate),
        subtitle: Text(L10().translateHelp),
        leading: Icon(TablerIcons.language, color: COLOR_ACTION),
        onTap: () {
          _translate();
        }
      )
    );

    tiles.add(
      ListTile(
        title: Text(L10().reportBug),
        subtitle: Text(L10().reportBugDescription),
        leading: Icon(TablerIcons.bug, color: COLOR_ACTION),
        onTap: () {
        _reportBug(context);
        },
      )
    );

    return Scaffold(
      appBar: AppBar(
        title: Text(L10().appAbout),
        backgroundColor: COLOR_APP_BAR,
      ),
      body: ListView(
        children: ListTile.divideTiles(
          context: context,
          tiles: tiles,
        ).toList(),
      )
    );
  }
}