using System.ComponentModel.DataAnnotations;

namespace JobsMedical.Web.Models;

/// <summary>
/// Single-row (Id=1) platform settings the admin controls at runtime — chiefly the ingestion
/// automation policy and the optional AI audit layer. Kept in the DB (not appsettings) so it's
/// editable from the admin panel without a redeploy.
/// </summary>
public class AppSetting
{
    public int Id { get; set; } = 1;

    // --- Ingestion automation ---
    public IngestionMode Mode { get; set; } = IngestionMode.Manual;

    /// <summary>In Automatic mode WITHOUT AI, listings at/above this confidence auto-publish.</summary>
    public int AutoPublishMinConfidence { get; set; } = 85;

    // --- AI audit layer (optional) ---
    public bool AiEnabled { get; set; } = false;

    /// <summary>OpenAI-compatible chat-completions endpoint (self-hosted or Iranian provider).</summary>
    [MaxLength(500)] public string? AiEndpoint { get; set; }
    [MaxLength(200)] public string? AiApiKey { get; set; }
    [MaxLength(120)] public string? AiModel { get; set; } = "gpt-4o-mini";

    /// <summary>The prompt + "framework" the AI follows to approve / reject / structure a listing.</summary>
    [MaxLength(4000)]
    public string AiSystemPrompt { get; set; } = DefaultPrompt;

    /// <summary>If AI approves AND Mode is Automatic, publish without human review.</summary>
    public bool AiAutoApprove { get; set; } = false;

    // --- Channel scraping sources (configured here, NOT in env) ---
    /// <summary>Run the ingestion worker on a timer.</summary>
    public bool AutoIngestEnabled { get; set; } = false;
    public int IngestIntervalMinutes { get; set; } = 30;

    public bool TelegramEnabled { get; set; } = false;
    /// <summary>Public Telegram channel usernames, one per line or comma-separated.</summary>
    [MaxLength(2000)] public string? TelegramChannels { get; set; }

    public bool BaleEnabled { get; set; } = false;
    [MaxLength(200)] public string? BaleBotToken { get; set; }

    public bool DivarEnabled { get; set; } = false;
    [MaxLength(60)] public string? DivarCity { get; set; } = "tehran";
    /// <summary>Divar search terms, one per line or comma-separated.</summary>
    [MaxLength(2000)] public string? DivarQueries { get; set; }

    /// <summary>Scrape medjobs.ir job ads (WordPress classifieds — crawled via its sitemaps).</summary>
    public bool MedjobsEnabled { get; set; } = false;
    /// <summary>Max ads to fetch per ingestion run (be polite; dedupe skips already-seen).</summary>
    public int MedjobsMaxAds { get; set; } = 40;

    public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;

    /// <summary>Split a textarea (newline/comma separated) into trimmed non-empty items.</summary>
    public static List<string> SplitList(string? s) => string.IsNullOrWhiteSpace(s)
        ? new()
        : s.Split(new[] { '\n', '\r', ',', '،' }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
           .ToList();

    public const string DefaultPrompt = """
        تو دستیار بررسی آگهی‌های کاری حوزه درمان برای پلتفرم «همکادر» هستی.
        هر آگهی خام را بخوان و تصمیم بگیر:
        - approve: آگهی واقعی و مرتبط با شیفت/استخدام کادر درمان است و اطلاعات کافی دارد.
        - reject: تبلیغ، اسپم، نامرتبط، یا فاقد اطلاعات حداقلی است.
        - review: مرتبط است اما ناقص/مبهم و نیاز به بررسی انسانی دارد.
        نقش، شهر/محله، نوع شیفت، نوع همکاری، مبلغ یا درصد سهم، و عنوان را در صورت وجود استخراج کن.
        فقط با یک شیء JSON پاسخ بده با کلیدهای:
        decision (approve|reject|review)، confidence (0-100)، reason (فارسی کوتاه)،
        kind (shift|job)، role، city، district، shiftType (day|evening|night|oncall)،
        employmentType (fulltime|parttime|contract|plan)، payAmount (عدد تومان یا null)،
        sharePercent (0-100 یا null)، title، facilityName.
        """;
}
