package org.f0w.k2i.core.exchange;

import com.google.common.collect.ImmutableMap;
import com.google.inject.Inject;
import com.typesafe.config.Config;
import lombok.NonNull;
import lombok.val;
import org.f0w.k2i.core.exchange.processor.JSONPOSTResponseProcessor;
import org.f0w.k2i.core.model.entity.Movie;
import org.jsoup.Connection;
import org.jsoup.helper.HttpConnection;

import java.io.IOException;
import java.net.URL;


/**
 * Adds Movie to IMDB list.
 */
public final class MovieWatchlistAssigner implements Exchangeable<Movie, Integer> {
    private final Config config;

    @Inject
    public MovieWatchlistAssigner(Config config) {
        this.config = config;
    }

    /**
     * Sends POST request and adds Movie to IMDB list, using {@link Movie#imdbId}
     *
     * @param movie Movie which should be added to IMDB list
     * @throws IOException If an I/O error occurs
     */
    @Override
    public ExchangeObject<Integer> prepare(@NonNull Movie movie) throws IOException {
        val list = config.getString("list");
        String url;
        Connection.Method method = Connection.Method.POST;
        if (list.equals("watchlist")) {
            url = "https://www.imdb.com/watchlist/" + movie.getImdbId();
            method = Connection.Method.PUT;
        }
        else {
            url = "https://www.imdb.com/list/" + list + '/' + movie.getImdbId() + "/add";
        }
        val movieAddToWatchlistLink = new URL(url);

        val postData = new ImmutableMap.Builder<String, String>()
                .put(config.getString("authControlKey"), config.getString("authControlValue"))
                .build();

        val request = HttpConnection.connect(movieAddToWatchlistLink)
                .method(method)
                .userAgent(config.getString("user_agent"))
                .timeout(config.getInt("timeout"))
                .cookie("session-id", config.getString("authSessionId"))
                .cookie("at-main", config.getString("authAtMain"))
                .cookie("ubid-main", config.getString("authUbidMain"))
                .header("Content-Type", "application/x-www-form-urlencoded")
                .ignoreContentType(true)
                .data(postData)
                .request();

        return new ExchangeObject<>(request, new JSONPOSTResponseProcessor());
    }
}