using foodmarket.Api.Seed;
using foodmarket.Application.Common.Tenancy;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace foodmarket.Api.Controllers.Admin;

/// <summary>Заполнение тестового стейджа реалистичными демо-данными по запросу
/// admin'a текущего tenant'а. См. <see cref="DemoTenantSeeder"/> — там логика
/// (5 групп / 50 товаров / 10 контрагентов / документы).
///
/// Использование: с UI кнопка «Заполнить демо-данными» в OrganizationSettingsPage
/// (только когда счётчик товаров = 0 в идемпотентной проверке).
///
/// Безопасность: только Admin'ы и SuperAdmin (override mode). Не использовать
/// на проде (UI кнопку прячем когда товары уже есть; но даже если нажмут —
/// идемпотентный маркер DEMO- защитит от дубля).</summary>
[ApiController]
[Authorize(Policy = "AdminAccess")]
[Route("api/admin/seed-demo")]
public class DemoSeedController : ControllerBase
{
    private readonly DemoTenantSeeder _seeder;
    private readonly ITenantContext _tenant;
    private readonly ILogger<DemoSeedController> _log;

    public DemoSeedController(DemoTenantSeeder seeder, ITenantContext tenant, ILogger<DemoSeedController> log)
    {
        _seeder = seeder;
        _tenant = tenant;
        _log = log;
    }

    /// <summary>Сводка: какие демо-сущности уже наполнены. Дешёвый — только count'ы,
    /// не вызывает seed. UI использует чтобы выбрать «Заполнить» vs «Сводка».</summary>
    [HttpGet("status")]
    public async Task<ActionResult<DemoTenantSeeder.SeedSummary>> Status(CancellationToken ct)
    {
        var orgId = _tenant.OrganizationId
            ?? throw new InvalidOperationException("No tenant in context");
        return Ok(await _seeder.PeekAsync(orgId, ct));
    }

    /// <summary>Запустить seed демо-данных. Идемпотентен — если уже наполнено,
    /// возвращает existing summary без вставок.</summary>
    [HttpPost]
    public async Task<ActionResult<DemoTenantSeeder.SeedSummary>> Run(CancellationToken ct)
    {
        var orgId = _tenant.OrganizationId
            ?? throw new InvalidOperationException("No tenant in context");
        _log.LogInformation("Demo seed requested for org={OrgId}", orgId);
        var result = await _seeder.SeedAsync(orgId, ct);
        _log.LogInformation("Demo seed done for org={OrgId}: products={Products} sales={Sales} already={Already}",
            orgId, result.Products, result.Sales, result.AlreadySeeded);
        return Ok(result);
    }
}
