#region Copyright

// /************************************************************************
//    Copyright (c) 2016 Jamie Rees
//    File: WatcherApi.cs
//    Created By: Jamie Rees
//   
//    Permission is hereby granted, free of charge, to any person obtaining
//    a copy of this software and associated documentation files (the
//    "Software"), to deal in the Software without restriction, including
//    without limitation the rights to use, copy, modify, merge, publish,
//    distribute, sublicense, and/or sell copies of the Software, and to
//    permit persons to whom the Software is furnished to do so, subject to
//    the following conditions:
//   
//    The above copyright notice and this permission notice shall be
//    included in all copies or substantial portions of the Software.
//   
//    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
//    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
//    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
//    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
//    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
//    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
//    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//  ************************************************************************/

#endregion

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using NLog;
using Ombi.Api.Interfaces;
using Ombi.Api.Models.Watcher;
using RestSharp;

namespace Ombi.Api
{
    public class WatcherApi : IWatcherApi
    {
        public WatcherApi()
        {
            Api = new ApiRequest();
        }

        private ApiRequest Api { get; set; }
        private static Logger Log = LogManager.GetCurrentClassLogger();

        public WatcherAddMovieResult AddMovie(string imdbId, string apiKey, Uri baseUrl)
        {
            var response =  Send("addmovie", apiKey, baseUrl, imdbId);
            try
            {
                return JsonConvert.DeserializeObject<WatcherAddMovieResult>(response.Content);
            }
            catch (Exception e)
            {
                Log.Error(e);
                return new WatcherAddMovieResult
                {
                    Error = true,
                    ErrorMessage = e.Message
                };
            }
        }
        public WatcherVersion Version(string apiKey, Uri baseUri)
        {
            var response = Send("version", apiKey, baseUri);
            try
            {
                return JsonConvert.DeserializeObject<WatcherVersion>(response.Content);
            }
            catch (Exception e)
            {
                Log.Error(e);
                return new WatcherVersion
                {
                    response = false,
                    ErrorMessage = e.Message
                };
            }
        }

        public WatcherListStatusResultContainer ListMovies(string apiKey, Uri baseUrl)
        {
           var response = Send("liststatus", apiKey, baseUrl);
            try
            {
                if (response.Content.Contains("No movies found"))
                {
                    return new WatcherListStatusResultContainer();
                }
                var items = JsonConvert.DeserializeObject<WatcherListStatusResultContainer>(response.Content);
                return items;
            }
            catch (Exception e)
            {
                Log.Error(e);
                return new WatcherListStatusResultContainer
                {
                    Error = true,
                    ErrorMessage = e.Message
                };
            }
        }

        public WatcherListStatusResultContainer ListMovies(string apiKey, Uri baseUrl, string imdbId)
        {
            var response = Send("liststatus", apiKey, baseUrl, imdbId);
            try
            {
                if (response.Content.Contains("No movies found"))
                {
                    return new WatcherListStatusResultContainer();
                }
                return JsonConvert.DeserializeObject<WatcherListStatusResultContainer>(response.Content);
            }
            catch (Exception e)
            {
                Log.Error(e);
                return new WatcherListStatusResultContainer
                {
                    Error = true,
                    ErrorMessage = e.Message
                };
            }
        }


        private IRestResponse Send(string mode, string apiKey, Uri baseUrl, string imdbid = "")
        {
            RestRequest request;
            request = new RestRequest
            {
                Resource = string.IsNullOrEmpty(imdbid) ? "/api?apikey={apikey}&mode={mode}" : "/api?apikey={apikey}&mode={mode}&imdbid={imdbid}"
            };

            
            request.AddUrlSegment("apikey", apiKey);
            if (!string.IsNullOrEmpty(imdbid))
            {
                request.AddUrlSegment("imdbid", imdbid);
            }
            request.AddUrlSegment("mode", mode);

            return Api.Execute(request, baseUrl);
        }
    }

}