import 'package:inventree/widget/company_detail.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

import 'package:inventree/api.dart';
import 'package:inventree/inventree/company.dart';
import 'package:inventree/widget/refreshable_state.dart';

abstract class CompanyListWidget extends StatefulWidget {

  final String title = "";
  Map<String, String> filters = {};

  @override
  _CompanyListState createState() => _CompanyListState(title, filters);

}

class SupplierListWidget extends CompanyListWidget {
  @override
  _CompanyListState createState() => _CompanyListState("Suppliers", {"is_supplier": "true"});
}


class ManufacturerListWidget extends CompanyListWidget {
  @override
  _CompanyListState createState() => _CompanyListState("Manufacturers", {"is_manufacturer": "true"});
}


class CustomerListWidget extends CompanyListWidget {
  @override
  _CompanyListState createState() => _CompanyListState("Customers", {"is_customer": "true"});
}


class _CompanyListState extends RefreshableState<CompanyListWidget> {

  List<InvenTreeCompany> _companies = [];

  List<InvenTreeCompany> _filteredCompanies = [];

  String _title = "Companies";

  @override
  String getAppBarTitle(BuildContext context) { return _title; }

  Map<String, String> _filters = Map<String, String>();

  _CompanyListState(this._title, this._filters);

  @override
  Future<void> onBuild(BuildContext context) async {
    refresh();
  }

  @override
  Future<void> request() async {

    await InvenTreeCompany().list(filters: _filters).then((var companies) {

      _companies.clear();

      for (var c in companies) {
        if (c is InvenTreeCompany) {
          _companies.add(c);
        }
      }

      setState(() {
        _filterResults("");
      });

    });
  }

  void _filterResults(String text) {

    if (text.isEmpty) {
      _filteredCompanies = _companies;
    } else {
      _filteredCompanies = _companies.where((c) => c.filter(text)).toList();
    }
  }

  Widget _showCompany(BuildContext context, int index) {

      InvenTreeCompany company = _filteredCompanies[index];

      return ListTile(
        title: Text("${company.name}"),
        subtitle: Text("${company.description}"),
        leading: InvenTreeAPI().getImage(company.image),
        onTap: () {
          if (company.pk > 0) {
            InvenTreeCompany().get(company.pk).then((var c) {
              if (c != null && c is InvenTreeCompany) {
                Navigator.push(context, MaterialPageRoute(builder: (context) => CompanyDetailWidget(c)));
              }
            });
          }
        },
      );
  }

  @override
  Widget getBody(BuildContext context) {
    return ListView(
      children: <Widget>[
        TextField(
          decoration: InputDecoration(
          hintText: 'Filter results',
          ),
          onChanged: (String text) {
            setState(() {
              _filterResults(text);
            });
          },
        ),
        ListView.builder(
          shrinkWrap: true,
            physics: ClampingScrollPhysics(),
            itemBuilder: _showCompany, itemCount: _filteredCompanies.length)
      ],
    );
  }
}