import 'dart:convert';
import 'package:http/http.dart' as http;

import 'package:scrobbles/models/data/counts_by_day.dart';
import 'package:scrobbles/models/data/counts_by_hour.dart';
import 'package:scrobbles/models/data/discoveries.dart';
import 'package:scrobbles/models/data/heatmap.dart';
import 'package:scrobbles/models/data/new_artists.dart';
import 'package:scrobbles/models/data/new_tracks.dart';
import 'package:scrobbles/models/data/statistics_global.dart';
import 'package:scrobbles/models/data/statistics_recent.dart';
import 'package:scrobbles/models/data/timeline.dart';
import 'package:scrobbles/models/data/topartists.dart';

class ScrobblesApi {
  static String baseUrl = 'https://scrobble.harrault.fr';

  static Future<StatisticsGlobalData?> fetchGlobalStatistics() async {
    final String url = '$baseUrl/stats';
    final response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      final Map<String, dynamic> rawData = jsonDecode(response.body) as Map<String, dynamic>;
      return StatisticsGlobalData.fromJson(rawData);
    }

    return null;
  }

  static Future<StatisticsRecentData?> fetchRecentStatistics(int daysCount) async {
    final String url = '$baseUrl/$daysCount/stats';
    final response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      final Map<String, dynamic> rawData = jsonDecode(response.body) as Map<String, dynamic>;
      return StatisticsRecentData.fromJson(rawData);
    }

    return null;
  }

  static Future<TimelineData?> fetchTimeline(int daysCount) async {
    final String url = '$baseUrl/data/$daysCount/timeline';
    final response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      final Map<String, dynamic> rawData = jsonDecode(response.body) as Map<String, dynamic>;
      return TimelineData.fromJson(rawData);
    }

    return null;
  }

  static Future<CountsByDayData?> fetchCountsByDay(int daysCount) async {
    final String url = '$baseUrl/data/$daysCount/counts-by-day';
    final response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      final Map<String, dynamic> rawData = jsonDecode(response.body) as Map<String, dynamic>;
      return CountsByDayData.fromJson(rawData);
    }

    return null;
  }

  static Future<CountsByHourData?> fetchCountsByHour(int daysCount) async {
    final String url = '$baseUrl/data/$daysCount/counts-by-hour';
    final response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      final Map<String, dynamic> rawData = jsonDecode(response.body) as Map<String, dynamic>;
      return CountsByHourData.fromJson(rawData);
    }

    return null;
  }

  static Future<DiscoveriesData?> fetchDiscoveries(int daysCount) async {
    final String url = '$baseUrl/data/$daysCount/news';
    final response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      final Map<String, dynamic> rawData = jsonDecode(response.body) as Map<String, dynamic>;
      return DiscoveriesData.fromJson(rawData);
    }

    return null;
  }

  static Future<TopArtistsData?> fetchTopArtists(int daysCount) async {
    final String url = '$baseUrl/data/$daysCount/top-artists';
    final response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      final Map<String, dynamic> rawData = jsonDecode(response.body) as Map<String, dynamic>;
      return TopArtistsData.fromJson(rawData);
    }

    return null;
  }

  static Future<HeatmapData?> fetchHeatmap(int daysCount) async {
    final String url = '$baseUrl/data/$daysCount/heatmap';
    final response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      final Map<String, dynamic> rawData = jsonDecode(response.body) as Map<String, dynamic>;
      return HeatmapData.fromJson(rawData);
    }

    return null;
  }

  static Future<NewArtistsData?> fetchNewArtists(int count) async {
    final String url = '$baseUrl/data/discoveries/artists/$count';
    final response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      final List<dynamic> rawData = jsonDecode(response.body) as List<dynamic>;
      return NewArtistsData.fromJson(rawData);
    }

    return null;
  }

  static Future<NewTracksData?> fetchNewTracks(int count) async {
    final String url = '$baseUrl/data/discoveries/tracks/$count';
    final response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      final List<dynamic> rawData = jsonDecode(response.body) as List<dynamic>;
      return NewTracksData.fromJson(rawData);
    }

    return null;
  }
}