using JobsMedical.Web.Data;
using JobsMedical.Web.Models;
using JobsMedical.Web.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;

namespace JobsMedical.Web.Pages.Jobs;

public class DetailsModel : PageModel
{
    private readonly AppDbContext _db;
    private readonly InterestService _interest;
    private readonly JobsMedical.Web.Services.Scraping.SettingsService _settings;

    public DetailsModel(AppDbContext db, InterestService interest,
        JobsMedical.Web.Services.Scraping.SettingsService settings)
    {
        _db = db;
        _interest = interest;
        _settings = settings;
    }

    public JobOpening? Job { get; private set; }
    public string? MapKey { get; private set; }
    public bool ShowContact { get; private set; }
    public bool Saved { get; private set; }
    public bool Reported { get; private set; }

    public async Task<IActionResult> OnGetAsync(int id)
    {
        await LoadAsync(id);
        if (Job is null) return NotFound();
        MapKey = (await _settings.GetAsync()).NeshanMapKey;
        Reported = Request.Query["reported"] == "1";
        await _interest.LogJobAsync(InterestEventType.View, id);
        return Page();
    }

    public async Task<IActionResult> OnPostInterestAsync(int id)
    {
        await LoadAsync(id);
        if (Job is null) return NotFound();
        await _interest.LogJobAsync(InterestEventType.Apply, id);
        ShowContact = true;
        return Page();
    }

    public async Task<IActionResult> OnPostSaveAsync(int id)
    {
        await LoadAsync(id);
        if (Job is null) return NotFound();
        await _interest.LogJobAsync(InterestEventType.Save, id);
        Saved = true;
        return Page();
    }

    public async Task<IActionResult> OnPostDismissAsync(int id)
    {
        await _interest.LogJobAsync(InterestEventType.Dismiss, id);
        return RedirectToPage("/Jobs/Index");
    }

    private async Task LoadAsync(int id)
    {
        Job = await _db.JobOpenings
            .Include(j => j.Facility).ThenInclude(f => f.City)
            .Include(j => j.Facility).ThenInclude(f => f.District)
            .Include(j => j.Role)
            .Include(j => j.Contacts)
            .FirstOrDefaultAsync(j => j.Id == id);
    }
}
