/*
 * Get Metadata from Douban Books api and Google Books api
 * Created by idalin<dalin.lin@gmail.com>
 * Google Books api document: https://developers.google.com/books/docs/v1/using
 * Douban Books api document: https://developers.douban.com/wiki/?title=book_v2 (Chinese Only)
 */

$(document).ready(function () {
    var msg = i18n_msg;
    var douban = 'https://api.douban.com';
    var db_search = '/v2/book/search';
    var db_get_info = '/v2/book/';
    var db_get_info_by_isbn = '/v2/book/isbn/ ';
    var db_done = false;

    var google = 'https://www.googleapis.com/';
    var gg_search = '/books/v1/volumes';
    var gg_get_info = '/books/v1/volumes/';
    var gg_done = false;

    var db_results = [];
    var gg_results = [];
    var show_flag = 0;
    String.prototype.replaceAll = function (s1, s2) {  
        return this.replace(new RegExp(s1, "gm"), s2);  
    }

    gg_search_book = function (title) {
        title = title.replaceAll(/\s+/, '+');
        var url = google + gg_search + '?q=' + title;
        $.ajax({
            url: url,
            type: "GET",
            dataType: "jsonp",
            jsonp: 'callback',
            success: function (data) {
                gg_results = data.items;
            },
            complete: function () {
                gg_done = true;
                show_result();
            }
        });
    }

    get_meta = function (source, id) {
        var meta;
        if (source == 'google') {;
            meta = gg_results[id];
            $('#description').val(meta.volumeInfo.description);
            $('#bookAuthor').val(meta.volumeInfo.authors.join(' & '));
            $('#book_title').val(meta.volumeInfo.title);
            if (meta.volumeInfo.categories) {
                var tags = meta.volumeInfo.categories.join(',');
                $('#tags').val(tags);
            }
            if (meta.volumeInfo.averageRating) {
                $('#rating').val(Math.round(meta.volumeInfo.averageRating));
            }
            return;
        }
        if (source == 'douban') {
            meta = db_results[id];
            $('#description').val(meta.summary);
            $('#bookAuthor').val(meta.author.join(' & '));
            $('#book_title').val(meta.title);
            var tags = '';
            for (var i = 0; i < meta.tags.length; i++) {
                tags = tags + meta.tags[i].title + ',';
            }
            $('#tags').val(tags);
            $('#rating').val(Math.round(meta.rating.average / 2));
            return;
        }
    }
    do_search = function (keyword) {
        show_flag = 0;
        $('#meta-info').text(msg.loading);
        var keyword = $('#keyword').val();
        if (keyword) {
            db_search_book(keyword);
            gg_search_book(keyword);
        }
    }

    db_search_book = function (title) {
        var url = douban + db_search + '?q=' + title + '&fields=all&count=10';
        $.ajax({
            url: url,
            type: "GET",
            dataType: "jsonp",
            jsonp: 'callback',
            success: function (data) {
                db_results = data.books;
            },
            error: function () {
                $('#meta-info').html('<p class="text-danger">'+ msg.search_error+'!</p>');
            },
            complete: function () {
                db_done = true;
                show_result();
            }
        });
    }

    show_result = function () {
        show_flag++;
        if (show_flag == 1) {
            $('#meta-info').html('<ul id="book-list" class="media-list"></ul>');
        }
        if (gg_done && db_done) {
            if (!gg_results && !db_results) {
                $('#meta-info').html('<p class="text-danger">'+ msg.no_result +'</p>');
                return;
            }
        }
        if (gg_done && gg_results.length > 0) {
            for (var i = 0; i < gg_results.length; i++) {
                var book = gg_results[i];
                var book_cover;
                if (book.volumeInfo.imageLinks) {
                    book_cover = book.volumeInfo.imageLinks.thumbnail;
                } else {
                    book_cover = '/static/generic_cover.jpg';
                }
                var book_html = '<li class="media">' +
                    '<img class="pull-left img-responsive" data-toggle="modal" data-target="#metaModal" src="' +
                    book_cover + '" alt="Cover" style="width:100px;height:150px" onclick=\'javascript:get_meta("google",' +
                    i + ')\'>' +
                    '<div class="media-body">' +
                    '<h4 class="media-heading"><a href="https://books.google.com/books?id=' +
                    book.id + '"  target="_blank">' + book.volumeInfo.title + '</a></h4>' +
                    '<p>'+ msg.author +':' + book.volumeInfo.authors + '</p>' +
                    '<p>'+ msg.publisher + ':' + book.volumeInfo.publisher + '</p>' +
                    '<p>'+ msg.description + ':' + book.volumeInfo.description + '</p>' +
                    '<p>'+ msg.source + ':<a href="https://books.google.com" target="_blank">Google Books</a></p>' +
                    '</div>' +
                    '</li>';
                $("#book-list").append(book_html);
            }
            gg_done = false;
        }
        if (db_done && db_results.length > 0) {
            for (var i = 0; i < db_results.length; i++) {
                var book = db_results[i];
                var book_html = '<li class="media">' +
                    '<img class="pull-left img-responsive" data-toggle="modal" data-target="#metaModal" src="' +
                    book.image + '" alt="Cover" style="width:100px;height: 150px" onclick=\'javascript:get_meta("douban",' +
                    i + ')\'>' +
                    '<div class="media-body">' +
                    '<h4 class="media-heading"><a href="https://book.douban.com/subject/' +
                    book.id + '"  target="_blank">' + book.title + '</a></h4>' +
                    '<p>' + msg.author + ':' + book.author + '</p>' +
                    '<p>' + msg.publisher + ':' + book.publisher + '</p>' +
                    '<p>' + msg.description + ':' + book.summary + '</p>' +
                    '<p>' + msg.source + ':<a href="https://book.douban.com" target="_blank">Douban Books</a></p>' +
                    '</div>' +
                    '</li>';
                $("#book-list").append(book_html);
            }
            db_done = false;
        }
    }

    $('#do-search').click(function () {
        var keyword = $('#keyword').val();
        if (keyword) {
            do_search(keyword);
        }
    });

    $('#get_meta').click(function () {
        var book_title = $('#book_title').val();
        if (book_title) {
            $('#keyword').val(book_title);
            do_search(book_title);
        }
    });

});