// Flutter
import 'package:flutter/material.dart';
import 'package:flutter_expense_tracker/models/item_type.dart';
import 'dart:io';

// Local
import '/pages/tracked_item.dart';
import '/pages/report.dart';
import '/pages/settings.dart';
import '/pages/help.dart';
import '/db.dart';

class HomePage extends StatefulWidget {
  const HomePage({
    super.key,
  });

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  var pageSelected = 0;

  refresh() {
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    Widget page;
    Widget? dialog;
    switch (pageSelected) {
      case 0:
        page = TrackedItemPage(
          assetsToLoad: DatabaseHelper.instance.getExpenses(),
          notifyParent: refresh,
        );
        dialog = TrackedItemInputDialog(
          notifyParent: refresh,
          type: ItemType.expense,
        );
        break;
      case 1:
        page = TrackedItemPage(
          assetsToLoad: DatabaseHelper.instance.getIncomes(),
          notifyParent: refresh,
        );
        dialog = TrackedItemInputDialog(
          notifyParent: refresh,
          type: ItemType.income,
        );
        break;
      case 2:
        page = TrackedItemPage(
          assetsToLoad: DatabaseHelper.instance.getAssets(),
          notifyParent: refresh,
        );
        dialog = TrackedItemInputDialog(
          notifyParent: refresh,
          type: ItemType.asset,
        );
        break;
      case 3:
        page = ProjectionPage();
        break;
      case 4:
        page = SettingsPage();
        break;
      case 5:
        page = HelpPage();
        break;
      default:
        throw UnimplementedError('No widget for page $pageSelected yet!');
    }

    Future<void> addNewValue(BuildContext context) {
      return showDialog(
        context: context,
        builder: (_) => AlertDialog(content: dialog),
      );
    }

    Widget? floatingButton;
    if (dialog != null) {
      floatingButton = IconButton(
        onPressed: () {
          addNewValue(context);
        },
        icon: Icon(Icons.add),
        color: Theme.of(context).colorScheme.onSurface,
      );
    }

    Widget navigation = NavigationRail(
      extended: true,
      destinations: [
        NavigationRailDestination(
          icon: Icon(Icons.payment),
          label: Text('Expenses'),
        ),
        NavigationRailDestination(
          icon: Icon(Icons.account_balance),
          label: Text('Income'),
        ),
        NavigationRailDestination(
          icon: Icon(Icons.attach_money),
          label: Text('Liquid Assets'),
        ),
        NavigationRailDestination(
          icon: Icon(Icons.bar_chart),
          label: Text('Reports'),
        ),
        NavigationRailDestination(
          icon: Icon(Icons.settings),
          label: Text('Settings'),
        ),
        NavigationRailDestination(
          icon: Icon(Icons.help),
          label: Text('Help'),
        ),
      ],
      selectedIndex: pageSelected,
      onDestinationSelected: (value) {
        setState(() {
          pageSelected = value;
          if (Platform.isAndroid || Platform.isIOS) {
            Navigator.pop(context);
          }
        });
      },
    );

    Widget main = Container(
      color: Theme.of(context).colorScheme.primaryContainer,
      child: Center(child: page),
    );

    Widget? drawer, body;
    if (Platform.isAndroid || Platform.isIOS) {
      drawer = navigation;
      body = main;
    } else {
      drawer = null;
      body = Row(
        children: [
          SafeArea(child: navigation),
          Expanded(child: main),
        ],
      );
    }

    return LayoutBuilder(builder: (context, constraints) {
      return Scaffold(
        appBar: AppBar(
          title: Text("Expense Tracker"),
        ),
        drawer: drawer,
        body: body,
        floatingActionButton: floatingButton,
      );
    });
  }
}