import 'dart:convert';

import 'package:http/http.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import '../mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:supertokens_flutter/http.dart' as http;

class MihBusinessDetailsServices {
  Future<List<String>> fetchAllBusinessTypes() async {
    var response = await http.get(
      Uri.parse("${AppEnviroment.baseApiUrl}/business/types/"),
      headers: <String, String>{
        "Content-Type": "application/json; charset=UTF-8"
      },
    );
    if (response.statusCode == 200) {
      List<dynamic> jsonList = jsonDecode(response.body);
      List<String> businessTypes =
          jsonList.map((item) => item['type'].toString()).toList();
      return businessTypes;
    } else {
      return [];
    }
  }

  Future<List<Business>> searchBusinesses(
    String searchText,
    String searchType,
    BuildContext context,
  ) async {
    String newSearchText = "All";
    if (searchText.isNotEmpty) {
      newSearchText = searchText;
    }
    String newSearchType = "All";
    if (searchType.isNotEmpty) {
      newSearchType = searchType;
    }
    if (searchText.isEmpty && searchType.isEmpty) {
      return [];
    }
    var response = await http.get(
      Uri.parse(
          "${AppEnviroment.baseApiUrl}/business/search/$newSearchType/$newSearchText"),
      headers: <String, String>{
        "Content-Type": "application/json; charset=UTF-8"
      },
    );
    if (response.statusCode == 200) {
      Iterable l = jsonDecode(response.body);
      List<Business> businesses =
          List<Business>.from(l.map((model) => Business.fromJson(model)));
      return businesses;
    } else {
      throw Exception('failed to load users');
    }
  }

  Future<Business?> getBusinessDetailsByUser(
    String app_id,
  ) async {
    var response = await http.get(
      Uri.parse("${AppEnviroment.baseApiUrl}/business/app_id/$app_id"),
      headers: <String, String>{
        "Content-Type": "application/json; charset=UTF-8"
      },
    );
    if (response.statusCode == 200) {
      String body = response.body;
      var jsonBody = jsonDecode(body);
      return Business.fromJson(jsonBody);
    } else {
      return null;
    }
  }

  Future<Business?> getBusinessDetailsByBusinessId(
    String business_id,
  ) async {
    var response = await http.get(
      Uri.parse(
          "${AppEnviroment.baseApiUrl}/business/business_id/$business_id"),
      headers: <String, String>{
        "Content-Type": "application/json; charset=UTF-8"
      },
    );
    if (response.statusCode == 200) {
      String body = response.body;
      var jsonBody = jsonDecode(body);
      return Business.fromJson(jsonBody);
    } else {
      return null;
    }
  }

  Future<Response> createBusinessDetails(
    String appId,
    String busineName,
    String businessType,
    String businessRegistrationNo,
    String businessPracticeNo,
    String businessVatNo,
    String businessEmail,
    String businessPhoneNumber,
    String businessLocation,
    String businessLogoFilename,
    String businessWebsite,
    String businessRating,
    String businessMissionVision,
    BuildContext context,
  ) async {
    showDialog(
      context: context,
      builder: (context) {
        return const Mihloadingcircle();
      },
    );
    String logoPath = businessLogoFilename.isNotEmpty
        ? "$appId/business_files/$businessLogoFilename"
        : "";
    var response = await http.post(
      Uri.parse("${AppEnviroment.baseApiUrl}/business/insert/"),
      headers: <String, String>{
        "Content-Type": "application/json; charset=UTF-8"
      },
      body: jsonEncode(<String, dynamic>{
        "Name": busineName,
        "type": businessType,
        "registration_no": businessRegistrationNo,
        "logo_name": businessLogoFilename,
        "logo_path": logoPath,
        "contact_no": businessPhoneNumber,
        "bus_email": businessEmail,
        "gps_location": businessLocation,
        "practice_no": businessPracticeNo,
        "vat_no": businessVatNo,
        "website": businessWebsite,
        "rating": businessRating,
        "mission_vision": businessMissionVision,
      }),
    );
    Navigator.of(context).pop();
    return response;
  }

  Future<int> updateBusinessDetailsV2(
    String business_id,
    String business_name,
    String business_type,
    String business_registration_no,
    String business_practice_no,
    String business_vat_no,
    String business_email,
    String business_phone_number,
    String business_location,
    String business_logo_name,
    String businessWebsite,
    String businessRating,
    String businessMissionVision,
    BuildContext context,
  ) async {
    showDialog(
      context: context,
      builder: (context) {
        return const Mihloadingcircle();
      },
    );
    var response = await http.put(
      Uri.parse("${AppEnviroment.baseApiUrl}/business/update/v2/"),
      headers: <String, String>{
        "Content-Type": "application/json; charset=UTF-8"
      },
      body: jsonEncode(<String, dynamic>{
        "business_id": business_id,
        "Name": business_name,
        "type": business_type,
        "registration_no": business_registration_no,
        "logo_name": business_logo_name,
        "logo_path": "$business_id/business_files/$business_logo_name",
        "contact_no": business_phone_number,
        "bus_email": business_email,
        "gps_location": business_location,
        "practice_no": business_practice_no,
        "vat_no": business_vat_no,
        "website": businessWebsite,
        "rating": businessRating,
        "mission_vision": businessMissionVision,
      }),
    );
    Navigator.of(context).pop();
    if (response.statusCode == 200) {
      return 200;
    } else {
      return 500;
    }
  }

  Future<int> updateBusinessDetails(
    String business_id,
    String business_name,
    String business_type,
    String business_registration_no,
    String business_practice_no,
    String business_vat_no,
    String business_email,
    String business_phone_number,
    String business_location,
    String business_logo_name,
    BuildContext context,
  ) async {
    showDialog(
      context: context,
      builder: (context) {
        return const Mihloadingcircle();
      },
    );
    var response = await http.put(
      Uri.parse("${AppEnviroment.baseApiUrl}/business/update/"),
      headers: <String, String>{
        "Content-Type": "application/json; charset=UTF-8"
      },
      body: jsonEncode(<String, dynamic>{
        "business_id": business_id,
        "Name": business_name,
        "type": business_type,
        "registration_no": business_registration_no,
        "logo_name": business_logo_name,
        "logo_path": "$business_id/business_files/$business_logo_name",
        "contact_no": business_phone_number,
        "bus_email": business_email,
        "gps_location": business_location,
        "practice_no": business_practice_no,
        "vat_no": business_vat_no,
      }),
    );
    Navigator.of(context).pop();
    if (response.statusCode == 200) {
      return 200;
    } else {
      return 500;
    }
  }

  void internetConnectionPopUp(BuildContext context) {
    showDialog(
      context: context,
      builder: (context) {
        return const MIHErrorMessage(errorType: "Internet Connection");
      },
    );
  }
}
