import 'package:fcs/domain/entities/box.dart';
import 'package:fcs/domain/entities/cargo.dart';
import 'package:fcs/domain/entities/package.dart';
import 'package:fcs/domain/vo/delivery_address.dart';
import 'package:fcs/helpers/theme.dart';
import 'package:fcs/localization/app_translations.dart';
import 'package:fcs/pages/delivery_address/delivery_address_row.dart';
import 'package:fcs/pages/delivery_address/model/delivery_address_model.dart';
import 'package:fcs/pages/main/model/main_model.dart';
import 'package:fcs/pages/main/util.dart';
import 'package:fcs/pages/widgets/local_text.dart';
import 'package:fcs/pages/widgets/my_data_table.dart';
import 'package:fcs/pages/widgets/progress.dart';
import 'package:flutter/material.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import 'package:timeline_list/timeline.dart';
import 'package:timeline_list/timeline_model.dart';

class BoxEditor extends StatefulWidget {
  final Box box;
  BoxEditor({this.box});

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

class _BoxEditorState extends State<BoxEditor> {
  TextEditingController _addressEditingController = new TextEditingController();
  TextEditingController _fromTimeEditingController =
      new TextEditingController();
  TextEditingController _toTimeEditingController = new TextEditingController();
  TextEditingController _noOfPackageEditingController =
      new TextEditingController();
  TextEditingController _weightEditingController = new TextEditingController();

  Box _box;
  bool _isLoading = false;
  List<String> _images = [
    "assets/photos/1.jpg",
    "assets/photos/2.jpg",
    "assets/photos/3.jpg"
  ];
  bool isNew;
  bool isMixBox = false;
  DeliveryAddress _shippingAddress = new DeliveryAddress();

  @override
  void initState() {
    super.initState();
    if (widget.box != null) {
      _box = widget.box;
      _shippingAddress = _box.shippingAddress;
      isNew = false;
      // _addressEditingController.text = _pickUp.address;
      // _fromTimeEditingController.text = _pickUp.fromTime;
      // _toTimeEditingController.text = _pickUp.toTime;
      // _noOfPackageEditingController.text = _pickUp.numberOfPackage.toString();
      // _weightEditingController.text = _pickUp.weight.toString();
    } else {
      List<Package> packages = [
        // PackageModel.packages[0],
        // PackageModel.packages[1],
        // PackageModel.packages[2]
      ];

      List<Cargo> _cargoTypes = [
        Cargo(type: 'General Cargo', weight: 25),
        Cargo(type: 'Medicine', weight: 20),
        Cargo(type: 'Dangerous Cargo', weight: 30)
      ];

      var shipmentModel =
          Provider.of<DeliveryAddressModel>(context, listen: false);
      _shippingAddress = shipmentModel.deliveryAddresses[1];

      isNew = true;
      _box = Box(
          rate: 0,
          weight: 75,
          width: 0,
          height: 0,
          length: 0,
          packages: packages,
          cargoTypes: _cargoTypes,
          shipmentWeight: 0);
    }
  }

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

  final DateFormat dateFormat = DateFormat("d MMM yyyy");
  List<TimelineModel> _models() {
    // return [];
    return _box.shipmentHistory
        .map((e) => TimelineModel(
            Padding(
              padding: const EdgeInsets.all(18.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  Text(e.status,
                      style: TextStyle(
                          color: e.done ? primaryColor : Colors.grey,
                          fontSize: 16,
                          fontWeight: FontWeight.bold)),
                  e.status == "Processed"
                      ? Text("(Waiting for payment)",
                          style: TextStyle(
                              color: e.done ? primaryColor : Colors.grey,
                              fontSize: 14,
                              fontWeight: FontWeight.bold))
                      : Container(),
                  Text(dateFormat.format(e.date)),
                ],
              ),
            ),
            iconBackground: e.done ? primaryColor : Colors.grey,
            icon: Icon(
              e.status == "Shipped"
                  ? Ionicons.ios_airplane
                  : e.status == "Delivered"
                      ? MaterialCommunityIcons.truck_fast
                      : e.status == "Processed"
                          ? MaterialIcons.check
                          : Octicons.package,
              color: Colors.white,
            )))
        .toList();
  }

  @override
  Widget build(BuildContext context) {
    var mainModel = Provider.of<MainModel>(context);
    return LocalProgress(
      inAsyncCall: _isLoading,
      child: Scaffold(
        appBar: AppBar(
          centerTitle: true,
          leading: new IconButton(
            icon: new Icon(Icons.close),
            onPressed: () => Navigator.of(context).pop(),
          ),
          backgroundColor: primaryColor,
          title: Text(AppTranslations.of(context).text("box.edit.title")),
        ),
        body: Card(
          child: Column(
            children: <Widget>[
              widget.box == null
                  ? Center(
                      child: Container(
                          padding: EdgeInsets.all(8), child: Text("New Box")))
                  : Center(child: nameWidget(_box.packageNumber)),
              Expanded(
                child: ListView(
                  children: [
                    ExpansionTile(
                      title: Text(
                        'Shipment Information',
                        style: TextStyle(
                            color: primaryColor, fontWeight: FontWeight.bold),
                      ),
                      children: [
                        Padding(
                          padding: const EdgeInsets.only(left: 20.0, right: 20),
                          child: DropdownButtonFormField(
                            value: _box.shipmentNumber,
                            decoration: InputDecoration(
                                fillColor: Colors.white,
                                labelText: 'FCS Shipment Number',
                                icon: Icon(Ionicons.ios_airplane,
                                    color: primaryColor)
                                // prefixIcon: Icon(Icons.play_arrow)
                                ),
                            items: ["A102", "A103", "A201", "A202"]
                                .map((e) =>
                                    DropdownMenuItem(child: Text(e), value: e))
                                .toList(),
                            onChanged: (map) => {},
                          ),
                        ),
                        Padding(
                          padding: const EdgeInsets.only(left: 8.0, right: 20),
                          child: new Row(
                            children: <Widget>[
                              new Checkbox(
                                  value: isMixBox,
                                  activeColor: primaryColor,
                                  onChanged: (bool value) {
                                    setState(() {
                                      isMixBox = value;
                                    });
                                  }),
                              SizedBox(
                                width: 5,
                              ),
                              Column(
                                crossAxisAlignment: CrossAxisAlignment.start,
                                children: <Widget>[
                                  new Text(
                                    "Mix Box",
                                    style: TextStyle(fontSize: 15.0),
                                  ),
                                ],
                              ),
                            ],
                          ),
                        ),
                        Padding(
                          padding: const EdgeInsets.only(left: 20.0, right: 20),
                          child: TextFormField(
                            initialValue:
                                isNew ? "FCS-0203-390-2" : "FCS-0203-390-2",
                            decoration: InputDecoration(
                                fillColor: Colors.white,
                                labelText: 'FCS_ID',
                                hintText: 'FCS_ID',
                                filled: true,
                                icon: Icon(Feather.user, color: primaryColor),
                                suffixIcon: IconButton(
                                    icon: Icon(Icons.search),
                                    onPressed: () {})),
                          ),
                        ),
                        Padding(
                          padding: const EdgeInsets.only(left: 20.0, right: 20),
                          child: TextFormField(
                            initialValue: _box.receiverName,
                            decoration: InputDecoration(
                                fillColor: Colors.white,
                                labelText: 'Customer Name',
                                filled: true,
                                icon: Icon(Feather.user, color: Colors.white),
                                suffixIcon: IconButton(
                                    icon: Icon(Icons.search),
                                    onPressed: () {})),
                          ),
                        ),
                        SizedBox(
                          height: 30,
                        )
                      ],
                    ),
                    ExpansionTile(
                      title: Text(
                        'Cargo Types',
                        style: TextStyle(
                            color: primaryColor, fontWeight: FontWeight.bold),
                      ),
                      children: [
                        // Padding(
                        //   padding: const EdgeInsets.only(left: 20.0, right: 20),
                        //   child: DropdownButtonFormField(
                        //     value: _box.packageType,
                        //     decoration: InputDecoration(
                        //         fillColor: Colors.white,
                        //         labelText: 'Cargo Type',
                        //         icon: Icon(Entypo.box, color: primaryColor)),
                        //     items: ["General", "Medicine", "Dangerous"]
                        //         .map((e) =>
                        //             DropdownMenuItem(child: Text(e), value: e))
                        //         .toList(),
                        //     onChanged: (map) => {},
                        //   ),
                        // ),
                        Padding(
                          padding: const EdgeInsets.only(left: 20.0, right: 20),
                          child: TextFormField(
                              initialValue: _box.weight.toString(),
                              textAlign: TextAlign.end,
                              decoration: InputDecoration(
                                fillColor: Colors.white,
                                labelText: 'Actual Weight',
                                filled: true,
                                icon: Icon(FontAwesomeIcons.weightHanging,
                                    color: primaryColor),
                              )),
                        ),
                        // Padding(
                        //   padding: const EdgeInsets.only(left: 20.0, right: 20),
                        //   child: TextFormField(
                        //       initialValue: _box.rate.toString(),
                        //       textAlign: TextAlign.end,
                        //       decoration: InputDecoration(
                        //         fillColor: Colors.white,
                        //         labelText: 'Rate',
                        //         filled: true,
                        //         icon: Icon(FontAwesomeIcons.tag,
                        //             color: primaryColor),
                        //       )),
                        // ),
                        // Padding(
                        //   padding: const EdgeInsets.only(left: 20.0, right: 20),
                        //   child: TextFormField(
                        //       initialValue: _box.amount.toString(),
                        //       textAlign: TextAlign.end,
                        //       decoration: InputDecoration(
                        //         fillColor: Colors.white,
                        //         labelText: 'Total Amount',
                        //         filled: true,
                        //         icon: Icon(FontAwesomeIcons.moneyBill,
                        //             color: primaryColor),
                        //       )),
                        // ),
                        Container(
                          padding: EdgeInsets.only(top: 10),
                          child: SingleChildScrollView(
                            scrollDirection: Axis.horizontal,
                            child: MyDataTable(
                              headingRowHeight: 40,
                              columnSpacing: 120,
                              columns: [
                                MyDataColumn(
                                  label: LocalText(
                                    context,
                                    "cargo.type",
                                    color: Colors.grey,
                                  ),
                                ),
                                MyDataColumn(
                                  label: LocalText(
                                    context,
                                    "cargo.weight",
                                    color: Colors.grey,
                                  ),
                                ),
                              ],
                              rows: getCargoRows(context),
                            ),
                          ),
                        ),
                        true
                            ? Container(
                                padding: EdgeInsets.only(top: 20),
                                child: Align(
                                  alignment: Alignment.bottomRight,
                                  child: FloatingActionButton.extended(
                                    icon: Icon(Icons.add),
                                    label: Text("Add Cargo"),
                                    backgroundColor: primaryColor,
                                    onPressed: () {
                                      // Navigator.of(context).push(
                                      //     BottomUpPageRoute(PackageAddition()));
                                    },
                                  ),
                                ),
                              )
                            : Container(),
                        SizedBox(height: 25),
                      ],
                    ),
                    ExpansionTile(
                      title: Text(
                        'Box Dimension',
                        style: TextStyle(
                            color: primaryColor, fontWeight: FontWeight.bold),
                      ),
                      children: [
                        Padding(
                          padding: const EdgeInsets.only(left: 20.0, right: 20),
                          child: fcsInputReadOnly(
                              "Shipment Weight", FontAwesomeIcons.weightHanging,
                              value: _box.shipmentWeight.toString()),
                        ),
                        Padding(
                          padding: const EdgeInsets.only(left: 20.0, right: 20),
                          child: TextFormField(
                              initialValue: _box.width.toString(),
                              textAlign: TextAlign.end,
                              decoration: InputDecoration(
                                fillColor: Colors.white,
                                labelText: 'Width',
                                filled: true,
                                icon: Icon(FontAwesomeIcons.arrowCircleRight,
                                    color: primaryColor),
                              )),
                        ),
                        Padding(
                          padding: const EdgeInsets.only(left: 20.0, right: 20),
                          child: TextFormField(
                              initialValue: _box.height.toString(),
                              textAlign: TextAlign.end,
                              decoration: InputDecoration(
                                fillColor: Colors.white,
                                labelText: 'Height',
                                filled: true,
                                icon: Icon(FontAwesomeIcons.arrowAltCircleUp,
                                    color: primaryColor),
                              )),
                        ),
                        Padding(
                          padding: const EdgeInsets.only(left: 20.0, right: 20),
                          child: TextFormField(
                              initialValue: _box.length.toString(),
                              textAlign: TextAlign.end,
                              decoration: InputDecoration(
                                fillColor: Colors.white,
                                labelText: 'Length',
                                filled: true,
                                icon: Icon(FontAwesomeIcons.arrowCircleUp,
                                    color: primaryColor),
                              )),
                        ),
                        SizedBox(height: 25),
                      ],
                    ),
                    ExpansionTile(
                      title: Text(
                        'Shipping Address',
                        style: TextStyle(
                            color: primaryColor, fontWeight: FontWeight.bold),
                      ),
                      children: [
                        DeliveryAddressRow(shippingAddress: _shippingAddress),
                        Container(
                          padding:
                              EdgeInsets.only(top: 20, bottom: 15, right: 15),
                          child: Align(
                            alignment: Alignment.bottomRight,
                            child: Container(
                              width: 130,
                              height: 40,
                              child: FloatingActionButton.extended(
                                materialTapTargetSize:
                                    MaterialTapTargetSize.shrinkWrap,
                                onPressed: () {},
                                icon: Icon(Icons.add),
                                label: Text(
                                  'Select \nAddress',
                                  style: TextStyle(fontSize: 12),
                                ),
                                backgroundColor: primaryColor,
                              ),
                            ),
                          ),
                        ),
                        SizedBox(height: 25),
                      ],
                    ),
                    isNew
                        ? Container()
                        : ExpansionTile(
                            title: Text(
                              'Status',
                              style: TextStyle(
                                  color: primaryColor,
                                  fontWeight: FontWeight.bold),
                            ),
                            children: <Widget>[
                              Container(
                                height: 500,
                                padding: EdgeInsets.only(left: 20),
                                child: isNew
                                    ? Container()
                                    : Timeline(
                                        children: _models(),
                                        position: TimelinePosition.Left),
                              ),
                            ],
                          )
                  ],
                ),
              ),
              widget.box == null
                  ? Align(
                      alignment: Alignment.bottomCenter,
                      child: Center(
                          child: Container(
                        width: 250,
                        child: FlatButton(
                          child: Text('Create New Box'),
                          color: primaryColor,
                          textColor: Colors.white,
                          onPressed: () {
                            Navigator.pop(context);
                          },
                        ),
                      )))
                  : Container(
                      child: Column(
                      children: <Widget>[
                        Align(
                            alignment: Alignment.bottomCenter,
                            child: Center(
                                child: Container(
                              width: 250,
                              child: FlatButton(
                                child: Text('Complete packing'),
                                color: primaryColor,
                                textColor: Colors.white,
                                onPressed: () {
                                  Navigator.pop(context);
                                },
                              ),
                            ))),
                        widget.box.status == 'Arrived'
                            ? Align(
                                alignment: Alignment.bottomCenter,
                                child: Center(
                                    child: Container(
                                  width: 250,
                                  child: FlatButton(
                                    child: Text('Deliver'),
                                    color: primaryColor,
                                    textColor: Colors.white,
                                    onPressed: () {
                                      Navigator.pop(context);
                                    },
                                  ),
                                )))
                            : Container(),
                      ],
                    )),
            ],
          ),
        ),
      ),
    );
  }

  List<MyDataRow> getCargoRows(BuildContext context) {
    if (_box == null || _box.cargoTypes == null) {
      return [];
    }
    return _box.cargoTypes.map((c) {
      return MyDataRow(
        onSelectChanged: (bool selected) {},
        cells: [
          MyDataCell(new Text(
            c.type == null ? "" : c.type,
            style: textStyle,
          )),
          MyDataCell(
            new Text(c.weight == null ? "0" : c.weight.toString(),
                style: textStyle),
          ),
        ],
      );
    }).toList();
  }

  List<Widget> getAddressList(
      BuildContext context, List<DeliveryAddress> addresses) {
    return addresses.asMap().entries.map((s) {
      return InkWell(
        onTap: () {},
        child: DeliveryAddressRow(shippingAddress: s.value, index: s.key),
      );
    }).toList();
  }
}
