using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using System.Text.Json.Serialization;

namespace Nalu.Jobs;

// ── IBGE API response ──────────────────────────────────────────────────────────

/// <summary>
/// Top-level element returned by /v2/censos/nomes/ranking/ (optionally ?sexo=M|F).
/// Shape: [{ "localidade": "BR", "sexo": "M"|"F"|null, "res": [...] }]
/// </summary>
public record IbgeRankingGroup
{
    [JsonPropertyName("localidade")]
    public string Localidade { get; init; } = "";

    /// <summary>null = overall, "M" = male, "F" = female</summary>
    [JsonPropertyName("sexo")]
    public string? Sexo { get; init; }

    [JsonPropertyName("res")]
    public IbgeNameEntry[] Res { get; init; } = [];
}

public record IbgeNameEntry
{
    [JsonPropertyName("nome")]
    public string Nome { get; init; } = "";

    [JsonPropertyName("frequencia")]
    public long Frequencia { get; init; }

    [JsonPropertyName("ranking")]
    public int Ranking { get; init; }
}

// ── In-memory aggregation ──────────────────────────────────────────────────────

public record AggregatedName(string Nome, long Frequencia, string Genero);

// ── MongoDB documents ──────────────────────────────────────────────────────────

public class NomeBr
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string? Id { get; set; }

    [BsonElement("nome")]
    public string Nome { get; set; } = "";

    [BsonElement("nome_display")]
    public string NomeDisplay { get; set; } = "";

    [BsonElement("tipo")]
    public string Tipo { get; set; } = "primeiro_nome";

    [BsonElement("frequencia")]
    public long Frequencia { get; set; }

    [BsonElement("genero")]
    public string Genero { get; set; } = "N";

    [BsonElement("fonte")]
    public string Fonte { get; set; } = "ibge_censo";

    [BsonElement("ultima_atualizacao")]
    public DateTime UltimaAtualizacao { get; set; }
}

public class JobRun
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string? Id { get; set; }

    [BsonElement("job")]
    public string Job { get; set; } = "NaluNameImporter";

    [BsonElement("executado_em")]
    public DateTime ExecutadoEm { get; set; }

    [BsonElement("total_processados")]
    public int TotalProcessados { get; set; }

    [BsonElement("total_inseridos")]
    public int TotalInseridos { get; set; }

    [BsonElement("total_atualizados")]
    public int TotalAtualizados { get; set; }

    [BsonElement("status")]
    public string Status { get; set; } = "sucesso";

    [BsonElement("erro")]
    public string? Erro { get; set; }
}
