import 'dart:async';

import 'package:html/parser.dart';
import 'package:http/http.dart';

void main() {
  BitsearchApi bitsearchApi = BitsearchApi();
  bitsearchApi.scrapTorrentDetails(
      '/torrents/key-skills-for-math-subtraction-practice-grade-1-t-5a628/60cfa5278d5bd55a19163ed3/');
}

class BitsearchApi {
//scrapTorrentDetails('/torrents/key-skills-for-math-subtraction-practice-grade-1-t-5a628/60cfa5278d5bd55a19163ed3/');
//scrapSearchTorrent('math');

  var _document;

  Future loadFullURL(String page) async {
    var client = Client();
    try {
      var _response = await client.get(Uri.parse(page));
      _document = parse(_response.body);
    } catch (e) {
      print(e.toString());
    }
    return true;
  }

  Future scrapTorrentDetails(String q) async {
    List simTorrData = [];
    await loadFullURL('https://bitsearch.to$q');

    var title = _document.getElementsByClassName('title')[0].text;
    var type = _document.getElementsByClassName('primary-bg')[0].text;
    var desc1 = _document.getElementsByClassName('view-box')[5].text;
    var files = _document.getElementsByClassName('file-name');
    var catHtml =
        parse(_document.getElementsByClassName('stat-table')[0].outerHtml);
    var dllinks =
        parse(_document.getElementsByClassName('dl-links')[0].outerHtml);
    var dawnloads = catHtml.getElementsByTagName('tr')[3].text.split('\n')[2];
    var size = catHtml.getElementsByTagName('tr')[2].text.split('\n')[2];
    var seedrs = catHtml.getElementsByTagName('tr')[0].text.split('\n')[2];
    var leechers = catHtml.getElementsByTagName('tr')[1].text.split('\n')[2];
    var uploaddate = catHtml.getElementsByTagName('tr')[4].text.split('\n')[2];
    var magnet = dllinks.getElementsByTagName('a')[1].attributes['href'];
    var torrent = dllinks.getElementsByTagName('a')[0].attributes['href'];
    List fileslist = [];
    for (var i = 0; i < files.length; i++) {
      fileslist.add(files[i].text);
    }
    var similarTorrTables = _document.getElementsByClassName('search-result');
    for (int i = 0; i < similarTorrTables.length; i++) {
      var htmlParse = parse(similarTorrTables[i].outerHtml);
      var links = htmlParse.getElementsByTagName('a').toList();
      var stats = htmlParse
          .getElementsByClassName('stats')[0]
          .text
          .split('\n')
          .toList();
      simTorrData.add({
        'title': htmlParse.getElementsByClassName('title')[0].text,
        'cat': htmlParse.getElementsByClassName('link-1')[0].text,
        'size': stats[3],
        'seed': stats[1],
        'leech': stats[2],
        'link': links[0].attributes['href'],
      });
    }
    var finalOut = {
      "title": title,
      "type": type,
      "cat": {
        'dawnloads': dawnloads.trim(),
        'size': size.trim(),
        'seedrs': seedrs.trim(),
        'leechers': leechers.trim(),
        'uploaddate': uploaddate.trim()
      },
      "torrent": torrent,
      "magnet": magnet,
      "description": desc1,
      "files": fileslist,
      "smiller": simTorrData
    };
    print(finalOut);
    return finalOut;
  }

  Future scrapSearchTorrent(String q,
      {String category = '',
      String subcat = '',
      String sort = '',
      String order = ''}) async {
    List torrData = [];
    await loadFullURL(
        'https://bitsearch.to/search?q=$q&category=$category&subcat=$subcat&sort=$sort&order=$order');
    var tables = _document.getElementsByClassName('search-result');
    for (int i = 0; i < tables.length; i++) {
      var text = tables[i].text.toString().split('\n');
      var htmlParse =
          parse(tables[i].outerHtml).getElementsByTagName('a').toList();
      torrData.add({
        'title': text[2],
        'cat': text[4],
        'downloads': text[6],
        'size': text[7],
        'seed': text[9],
        'leech': text[12],
        'date': text[14],
        'link': htmlParse[0].attributes['href'],
        'torrent': htmlParse[2].attributes['href'],
        'magnet': htmlParse[3].attributes['href']
      });
    }
    print(torrData);
    return torrData;
  }
}