using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Logging;
using AyaNova.Models;
using AyaNova.Util;
using AyaNova.Api.ControllerHelpers;
using AyaNova.Biz;


namespace AyaNova.Api.Controllers
{

    /// <summary>
    /// Log files controller
    /// </summary>
    [ApiVersion("8.0")]
    [Route("api/v{version:apiVersion}/[controller]")]
    //[Produces("application/json")]
    [Authorize]
    public class LogFilesController : Controller
    {
        private readonly AyContext ct;
        private readonly ILogger<LogFilesController> log;
        private readonly ApiServerState serverState;


        /// <summary>
        /// ctor
        /// </summary>
        /// <param name="dbcontext"></param>
        /// <param name="logger"></param>
        /// <param name="apiServerState"></param>
        public LogFilesController(AyContext dbcontext, ILogger<LogFilesController> logger, ApiServerState apiServerState)
        {
            ct = dbcontext;
            log = logger;
            serverState = apiServerState;
        }




        /// <summary>
        /// Get server log 
        /// 
        /// Required roles:
        /// OpsAdminFull | OpsAdminLimited
        /// </summary>
        /// <param name="logname"></param>
        /// <returns>A single log file in plain text</returns>
        [HttpGet("{logname}")]
        public ActionResult GetLog([FromRoute] string logname)
        {
             //Open or opsOnly and user is opsadminfull or opsadminlimited
            if (!serverState.IsOpenOrOpsOnly || (serverState.IsOpsOnly && !Authorized.HasAnyRole(HttpContext.Items, AuthorizationRoles.OpsAdminFull | AuthorizationRoles.OpsAdminLimited)))
            {
                return StatusCode(503, new ApiErrorResponse(ApiErrorCode.API_CLOSED, null, serverState.Reason));
            }

            if (!Authorized.IsAuthorizedToReadFullRecord(HttpContext.Items, AyaType.LogFile))
            {
                return StatusCode(401, new ApiNotAuthorizedResponse());
            }

            if (!ModelState.IsValid)
            {
                return BadRequest(new ApiErrorResponse(ModelState));
            }

            //stream the file contents into a json object and return

            //build the full path from the log file name and defined path
            var logFilePath = System.IO.Path.Combine(ServerBootConfig.AYANOVA_LOG_PATH, logname);
            //does file exist?
            if (!System.IO.File.Exists(logFilePath))
            {
                return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND));
            }

           
           //Log
           // EventLogProcessor.AddEntry(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.LogFile, AyaEvent.Retrieved,logname), ct);

            return Content(System.IO.File.ReadAllText(logFilePath));

        }



        /// <summary>
        /// Get list of operations logs 
        /// 
        /// Required roles:
        /// OpsAdminFull | OpsAdminLimited
        /// 
        /// </summary>
        /// <returns></returns>            
        [HttpGet()]
        public ActionResult ListLogs()
        {
             //Open or opsOnly and user is opsadminfull or opsadminlimited
            if (!serverState.IsOpenOrOpsOnly || (serverState.IsOpsOnly && !Authorized.HasAnyRole(HttpContext.Items, AuthorizationRoles.OpsAdminFull | AuthorizationRoles.OpsAdminLimited)))
            {
                return StatusCode(503, new ApiErrorResponse(ApiErrorCode.API_CLOSED, null, serverState.Reason));
            }

            if (!Authorized.IsAuthorizedToReadFullRecord(HttpContext.Items, AyaType.LogFile))
            {
                return StatusCode(401, new ApiNotAuthorizedResponse());
            }

            if (!ModelState.IsValid)
            {
                return BadRequest(new ApiErrorResponse(ModelState));
            }


            //Iterate all log files and build return
            var files = System.IO.Directory.GetFiles(ServerBootConfig.AYANOVA_LOG_PATH, "log-ayanova*.txt");

            Newtonsoft.Json.Linq.JObject o = Newtonsoft.Json.Linq.JObject.FromObject(new
            {
                logs =
                           from f in files
                           orderby f
                           select new
                           {
                               logName = System.IO.Path.GetFileName(f)
                           }
            });

           


            return Ok(new ApiOkResponse(o));
        }




        //------------


    }
}