using System.ComponentModel.DataAnnotations;
using System.Text.Json;
using Tiku.Application.Growth;

namespace Tiku.Api.Contracts;

public sealed class UpsertCrmConfigDto
{
    public bool Enabled { get; set; }

    [StringLength(2048)]
    public string? Url { get; set; }

    [StringLength(300)]
    public string? SecretRef { get; set; }

    public string? Secret { get; set; }

    [StringLength(200)]
    public string? FormName { get; set; }

    [StringLength(100)]
    public string? ExamType { get; set; }

    [Range(1, 120)]
    public int? TimeoutSeconds { get; set; }

    [Range(0, 86400)]
    public int? DelaySeconds { get; set; }

    [StringLength(50)]
    public string? AssignmentMode { get; set; }

    public JsonElement? AssignmentPool { get; set; }

    public JsonElement? AssignmentConfig { get; set; }

    public UpsertCrmConfigCommand ToCommand()
    {
        return new UpsertCrmConfigCommand(
            Enabled,
            Url,
            SecretRef,
            Secret,
            FormName,
            ExamType,
            TimeoutSeconds,
            DelaySeconds,
            AssignmentMode,
            AssignmentPool,
            AssignmentConfig);
    }
}

public sealed class CrmQueueQueryDto
{
    [StringLength(50)]
    public string? Status { get; set; }

    public Guid? QueueId { get; set; }

    [StringLength(200)]
    public string? Source { get; set; }

    [Range(1, 500)]
    public int? Limit { get; set; }

    public CrmQueueQuery ToQuery()
    {
        return new CrmQueueQuery(Status, QueueId, Source, Limit);
    }
}

public sealed class CrmQueueLogQueryDto
{
    public Guid? QueueId { get; set; }

    [Range(1, 200)]
    public int? Limit { get; set; }

    public CrmQueueLogQuery ToQuery()
    {
        return new CrmQueueLogQuery(QueueId, Limit);
    }
}

public sealed class CrmQueueActionDto
{
    [Required]
    public Guid QueueId { get; set; }

    [StringLength(50)]
    public string? Action { get; set; }

    [StringLength(500)]
    public string? Note { get; set; }

    public JsonElement? Metadata { get; set; }

    public CrmQueueActionCommand ToCommand()
    {
        return new CrmQueueActionCommand(QueueId, Action, Note, Metadata);
    }
}
