using AsbCloudApp.Data;
using AsbCloudInfrastructure.Background;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace AsbCloudWebApi.Controllers;

[Route("api/[controller]")]
[Authorize]
[ApiController]
public class BackgroundWorkController : ControllerBase
{
    private readonly BackgroundWorker worker;

    public BackgroundWorkController(BackgroundWorker worker)
    {
        this.worker = worker;
    }

    [HttpGet]
    public IActionResult GetAll()
    {
        var result = new {
            CurrentWork = (BackgroundWorkDto?)worker.CurrentWork,
            worker.MainLoopLastException,
            RunOnceQueue = worker.Works.Select(work => (BackgroundWorkDto)work),
            Done = worker.Done.Select(work => (BackgroundWorkDto)work),
            Felled = worker.Felled.Select(work => (BackgroundWorkDto)work),
        };
        return Ok(result);
    }

    [HttpGet("current")]
    public IActionResult GetCurrent()
    {
        var work = worker.CurrentWork;
        if (work == null)
            return NoContent();

        return Ok(work);
    }

    [HttpGet("failed")]
    public IActionResult GetFelled()
    {
        var result = worker.Felled.Select(work => (BackgroundWorkDto)work);
        return Ok(result);
    }

    [HttpGet("done")]
    public IActionResult GetDone()
    {
        var result = worker.Done.Select(work => (BackgroundWorkDto)work);
        return Ok(result);
    }

    [HttpPost("restart"), Obsolete("temporary method")]
    public async Task<IActionResult> RestartAsync(CancellationToken token)
    {
        await worker.StopAsync(token);
        await worker.StartAsync(token);
        return Ok();
    }
}