import 'dart:convert';
import 'dart:developer';
import 'dart:io';

import 'package:unit2/model/passo/bldg_loc.dart';
import 'package:unit2/model/passo/general_description.dart';
import 'package:unit2/model/passo/land_ref.dart';
import 'package:unit2/model/passo/property_info.dart';
import 'package:http/http.dart' as http;
import 'package:unit2/utils/request.dart';
import 'package:unit2/utils/urls.dart';

class PropertyInfoService {
  static final PropertyInfoService _instance = PropertyInfoService();
  static PropertyInfoService get instance => _instance;
  String xClientKey = "unitK3CQaXiWlPReDsBzmmwBZPd9Re1z";
  String xClientKeySecret = "unitcYqAN7GGalyz";

  Future<List<PropertyInfo>> fetch() async {
    String path = Url.instance.propertyInfo();
    Map<String, String> headers = {
      'Content-Type': 'application/json; charset=UTF-8',
      'X-Client-Key': xClientKey,
      'X-Client-Secret': xClientKeySecret
    };

    try {
      http.Response response = await Request.instance
          .getRequest(param: {}, path: path, headers: headers);
      if (response.statusCode == 200) {
        final List result = jsonDecode(response.body)['data'];

        return result.map(((e) => PropertyInfo.fromJson(e))).toList();
      } else {
        throw Exception(response.reasonPhrase);
      }
    } catch (e) {
      throw e.toString();
    }
  }

  Future<http.Response?> add(PropertyInfo faas) async {
    Map<dynamic, dynamic> statusResponse = {};
    String path = Url.instance.propertyInfo();
    Map<String, String> headers = {
      'Content-Type': 'application/json; charset=UTF-8',
      'X-Client-Key': xClientKey,
      'X-Client-Secret': xClientKeySecret
    };
    http.Response? response;
    try {
      response = await Request.instance.postRequest(
          param: {}, path: path, body: faas.toJson(), headers: headers);
    } catch (e) {
      throw e.toString();
    }
    return response;
  }

  Future<http.Response?> update(PropertyInfo data, id) async {
    String path = "${Url.instance.propertyInfo()}$id/";
    Map<String, String> headers = {
      'Content-Type': 'application/json; charset=UTF-8',
      'X-Client-Key': xClientKey,
      'X-Client-Secret': xClientKeySecret
    };

    http.Response? response;
    try {
      response = await Request.instance.putRequest(
          path: path, body: data.toJson(), headers: headers, param: {});
    } catch (e) {
      throw e.toString();
    }
    return response;
  }

  Future<http.Response?> updateBldg(BldgLoc data, id) async {
    String path = Url.instance.bldgLocation();
    Map<String, String> headers = {
      'Content-Type': 'application/json; charset=UTF-8',
      'X-Client-Key': xClientKey,
      'X-Client-Secret': xClientKeySecret
    };
    Map<String, String> params = {
      "bldgappr_details_id": id.toString(),
    };
    http.Response? response;
    try {
      response = await Request.instance.putRequest(
          path: path, body: data.toJson(), headers: headers, param: params);
    } catch (e) {
      throw e.toString();
    }
    return response;
  }

  Future<http.Response?> updateLandRef(LandRef data, id) async {
    String path = Url.instance.landRef();
    Map<String, String> headers = {
      'Content-Type': 'application/json; charset=UTF-8',
      'X-Client-Key': xClientKey,
      'X-Client-Secret': xClientKeySecret
    };
    Map<String, String> params = {
      "bldgappr_details_id": id.toString(),
    };
    http.Response? response;
    try {
      response = await Request.instance.putRequest(
          path: path, body: data.toJson(), headers: headers, param: params);
    } catch (e) {
      throw e.toString();
    }
    return response;
  }

  Future<http.Response?> updateGenDesc(GeneralDesc data, id) async {
    String path = Url.instance.generalDescription();
    Map<String, String> headers = {
      'Content-Type': 'application/json; charset=UTF-8',
      'X-Client-Key': xClientKey,
      'X-Client-Secret': xClientKeySecret
    };
    Map<String, String> params = {
      "bldgappr_details_id": id.toString(),
    };
    http.Response? response;
    try {
      response = await Request.instance.putRequest(
          path: path, body: data.toJson(), headers: headers, param: params);
    } catch (e) {
      throw e.toString();
    }
    return response;
  }
}
