import 'dart:convert';

import 'package:dio/dio.dart';
import 'package:voyagehandbook/api/classes.dart';
import 'package:voyagehandbook/util/storage.dart';

/*
        Voyage Handbook - The open-source WikiVoyage reader
        Copyright (C) 2023 Matyáš Caras

        This program is free software: you can redistribute it and/or modify
        it under the terms of the GNU General Public License version 3 as published by
        the Free Software Foundation.

        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.

        You should have received a copy of the GNU General Public License
        along with this program.  If not, see <https://www.gnu.org/licenses/>.
*/

class WikiApi {
  static final _dio = Dio(
      BaseOptions(baseUrl: "https://api.wikimedia.org/core/v1/wikivoyage/en/"));

  static Future<Response> _getRequest(String endpoint) async {
    return await _dio.get(
      endpoint,
      options: Options(
          headers: {"User-Agent": "VoyageHandbook/1.0.0"},
          validateStatus: (_) => true,
          responseType: ResponseType.plain),
    );
  }

  /// Searches for pages using the WikiMedia API
  static Future<List<SearchResponse>> search(String q, {int limit = 5}) async {
    var r = await _getRequest("search/page?q=$q&limit=$limit");
    if (r.statusCode! > 399) return Future.error("API error ${r.statusCode}");
    var json = jsonDecode(r.data)["pages"];
    var list = List<SearchResponse>.generate(
        json.length, (index) => SearchResponse.fromJson(json[index]));
    for (var item in list) {
      if (await StorageAccess.isDownloaded(item.key)) {
        list[list.indexOf(item)].downloaded = true;
      }
    }
    return list;
  }

  static Future<RawPage> getRawPage(String key) async {
    var r = await _getRequest("page/$key/with_html");
    if (r.statusCode! > 399) return Future.error("API error ${r.statusCode}");
    return RawPage.fromJson(jsonDecode(r.data));
  }
}
