import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:convert';
import 'package:image_picker/image_picker.dart';
import '../config/config.dart';

class Api {
  static const String baseUrl = Config.baseUrl;

  // 사용자 정보를 업데이트하는 메서드
  static Future<Map<String, dynamic>> serverRequest({
    required String uri,
    required Map<String, dynamic> body,
  }) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String? authToken = prefs.getString('auth_token');

    final url = '$baseUrl$uri'; // URL 생성
    final headers = { // 헤더 설정
      'Content-Type': 'application/json',
      'auth-token': authToken ?? '',
    };

    final response = await http.post(
      Uri.parse(url),
      headers: headers,
      body: json.encode(body),
    );

    // 변경 가능한 변수 res 선언
    Map<String, dynamic> res;

    if (response.statusCode == 200) {
      String responseBody = utf8.decode(response.bodyBytes);
      final Map<String, dynamic> jsonResponse = jsonDecode(responseBody);

      await prefs.setString('auth_token', jsonResponse['auth']['token']);
      res = {
        'result': "OK",
        'response': jsonResponse,
      };
    } else {
      res = {
        'result': "FAIL",
        'response': '',
      }; // 요청 실패 시 응답 반환
    }
    
    return res; // res 반환
  }

  static Future<Map<String, dynamic>> uploadProfileImage(XFile image, {Map<String, dynamic>? body}) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String? authToken = prefs.getString('auth_token');
    
    final uri = Uri.parse(Config.uploadImageUrl);
    final headers = { // 헤더 설정
      'auth-token': authToken ?? '',
    };
    
    final request = http.MultipartRequest('POST', uri)
      ..headers.addAll(headers); // 헤더 추가

    // 이미지 파일을 MultipartFile로 변환
    final file = await http.MultipartFile.fromPath('file', image.path);
    request.files.add(file);

    // body가 null이 아닐 경우 추가
    if (body != null) {
      request.fields['body'] = json.encode(body); // JSON 형식으로 body 추가
    }

    Map<String, dynamic> res;

    try {
      // 서버에 요청 전송
      final response = await request.send();

      if (response.statusCode == 200) {
        // 응답을 바이트로 읽고 UTF-8로 디코딩
        final responseData = await response.stream.toBytes();
        final responseString = utf8.decode(responseData); // UTF-8로 디코딩
        final jsonResponse = json.decode(responseString);

        await prefs.setString('auth_token', jsonResponse['auth']['token']);
        res = {
          'result': "OK",
          'response': jsonResponse,
        };
      } else {
        res = {
          'result': "FAIL",
          'response': '',
        }; // 요청 실패 시 응답 반환
      }
    } catch (e) {
      res = {
        'result': "FAIL",
        'response': '',
      };
    }

    return res; // Map<String, dynamic> 반환
  }
}