using Common;
using Masuit.MyBlogs.Core.Extensions;
using Masuit.MyBlogs.Core.Models.DTO;
using Masuit.MyBlogs.Core.Models.Entity;
using Masuit.MyBlogs.Core.Models.Enum;
using Masuit.MyBlogs.Core.Models.ViewModel;
using Masuit.Tools;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Net.Http.Headers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace Masuit.MyBlogs.Core.Controllers
{
    /// 
    /// 友情链接管理
    ///  
    public class LinksController : BaseController
    {
        /// 
        /// 友情链接页
        ///  
        /// (SessionKey.UserInfo);
            List list = LinksService.LoadEntities(l => l.Status == Status.Available, l => l.Recommend, false).ToList();
            if (user != null && user.IsAdmin)
            {
                return View("Index_Admin", list);
            }
            return View(list);
        }
        /// 
        /// 申请友链
        ///  
        ///  Apply(Links links)
        {
            if (!links.Url.MatchUrl())
            {
                return ResultData(null, false, "添加失败!链接非法!");
            }
            var host = new Uri(links.Url).Host;
            if (LinksService.Any(l => l.Url.Contains(host)))
            {
                return ResultData(null, false, "添加失败!检测到您的网站已经是本站的友情链接了!");
            }
            Uri uri = new Uri(links.Url);
            using (HttpClient client = new HttpClient()
            {
                BaseAddress = uri,
                Timeout = TimeSpan.FromSeconds(10)
            })
            {
                client.DefaultRequestHeaders.UserAgent.Add(ProductInfoHeaderValue.Parse("Mozilla/5.0"));
                client.DefaultRequestHeaders.Referrer = new Uri(Request.Scheme + "://" + Request.Host.ToString());
                return await await client.GetAsync(uri.PathAndQuery).ContinueWith(async t =>
                {
                    if (t.IsFaulted || t.IsCanceled)
                    {
                        return ResultData(null, false, "添加失败!检测到您的网站疑似挂了,或者连接到你网站的时候超时,请检查下!");
                    }
                    var res = await t;
                    if (res.IsSuccessStatusCode)
                    {
                        var s = await res.Content.ReadAsStringAsync();
                        if (s.Contains(CommonHelper.SystemSettings["Domain"]))
                        {
                            var entry = LinksService.GetFirstEntity(l => l.Url.Equals(links.Url));
                            bool b;
                            if (entry is null)
                            {
                                b = LinksService.AddEntitySaved(links) != null;
                            }
                            else
                            {
                                entry.Url = links.Url;
                                entry.Except = links.Except;
                                entry.Name = links.Name;
                                entry.Recommend = links.Recommend;
                                b = LinksService.UpdateEntitySaved(entry);
                            }
                            return ResultData(null, b, b ? "添加成功!这可能有一定的延迟,如果没有看到您的链接,请稍等几分钟后刷新页面即可,如有疑问,请联系站长。" : "添加失败!这可能是由于网站服务器内部发生了错误,如有疑问,请联系站长。");
                        }
                        return ResultData(null, false, $"添加失败!检测到您的网站上未将本站设置成友情链接,请先将本站主域名:{CommonHelper.SystemSettings["Domain"]}在您的网站设置为友情链接,并且能够展示后,再次尝试添加即可!");
                    }
                    return ResultData(null, false, "添加失败!检测到您的网站疑似挂了!返回状态码为:" + res.StatusCode);
                });
            }
        }
        /// 
        /// 添加友链
        ///  
        /// 
        /// 检测回链
        ///  
        ///  Check(string link)
        {
            Uri uri = new Uri(link);
            using (var client = new HttpClient()
            {
                BaseAddress = uri,
                Timeout = TimeSpan.FromSeconds(10)
            })
            {
                client.DefaultRequestHeaders.UserAgent.Add(ProductInfoHeaderValue.Parse("Mozilla/5.0"));
                return await await client.GetAsync(uri.PathAndQuery).ContinueWith(async t =>
                {
                    if (t.IsFaulted || t.IsCanceled)
                    {
                        return ResultData(null, false, link + " 似乎挂了!");
                    }
                    var res = await t;
                    if (res.IsSuccessStatusCode)
                    {
                        var s = await res.Content.ReadAsStringAsync();
                        if (s.Contains(CommonHelper.SystemSettings["Domain"]))
                        {
                            return ResultData(null, true, "友情链接正常!");
                        }
                        return ResultData(null, false, link + " 对方似乎没有本站的友情链接!");
                    }
                    return ResultData(null, false, link + " 对方网站返回错误的状态码!http响应码为:" + res.StatusCode);
                });
            }
        }
        /// 
        /// 删除友链
        ///  
        /// 
        /// 编辑友链
        ///  
        /// 
        /// 分页数据
        ///  
        ///  list = LinksService.GetAll().OrderBy(p => p.Status).ThenByDescending(p => p.Recommend).ThenByDescending(p => p.Id).Skip((page - 1) * size).Take(size).ToList();
            var total = LinksService.GetAll().Count();
            var pageCount = Math.Ceiling(total * 1.0 / size).ToInt32();
            return PageResult(list, pageCount, total);
        }
        /// 
        /// 切换友情链接的白名单状态
        ///  
        /// 
        /// 切换友情链接的推荐状态
        ///  
        /// 
        /// 切换友情链接可用状态
        ///  
        ///