// Anomaly rules of the fleet app: the Dadycar defaults every client inherits.
// A client who changed a setting keeps his own value; the others follow.

export type AnomalyRuleSeverity = "high" | "medium" | "low";
export type AnomalyRuleDigest = "none" | "daily" | "weekly" | "monthly";

export interface AnomalyRuleField {
  key: string;
  kind: "number";
  label: string;
  label_fr: string;
  label_en: string;
  unit: string | null;
  min: number;
  max: number;
  step: number;
  /** Value in force for every client who did not change it. */
  value: number;
  /** The value written in the rule's code, before any Dadycar change. */
  factory_default: number;
}

export interface AnomalyRuleChannels {
  mobile_push: boolean;
  fleet_push: boolean;
  email: boolean;
  digest_frequency: AnomalyRuleDigest;
}

export interface AnomalyRuleDefaults {
  key: string;
  name: string;
  name_fr: string;
  name_en: string;
  category: string;
  explanation: string | null;
  condition: string;
  is_active: boolean;
  default_enabled: boolean;
  default_severity: AnomalyRuleSeverity;
  sets_own_severity: boolean;
  channels: AnomalyRuleChannels;
  fields: AnomalyRuleField[];
  customized_count: number;
  disabled_count: number;
}

export interface AnomalyRuleOption {
  value: string;
  label: string;
  color?: string;
}

export interface AnomalyRulesResponse {
  rules: AnomalyRuleDefaults[];
  categories: AnomalyRuleOption[];
  severities: AnomalyRuleOption[];
  digest_frequencies: AnomalyRuleOption[];
}

export interface AnomalyRuleClient {
  company_id: number;
  company_name: string | null;
  enabled: boolean;
  severity: AnomalyRuleSeverity | null;
  channels: AnomalyRuleChannels;
  changed_fields: { key: string; label: string; unit: string | null; value: number; default: number }[];
  condition: string;
  updated_at: string | null;
  updated_by: string | null;
}

export interface AnomalyRuleChange {
  scope: "client" | "dadycar";
  action: "update" | "reset";
  company_name: string | null;
  user: string | null;
  changes: Record<string, { from: unknown; to: unknown }>;
  created_at: string | null;
}

export interface AnomalyRuleClientsResponse {
  rule: AnomalyRuleDefaults;
  clients: AnomalyRuleClient[];
  history: AnomalyRuleChange[];
}

export interface UpdateAnomalyRuleDefaultsPayload {
  is_active?: boolean;
  default_enabled?: boolean;
  default_severity?: AnomalyRuleSeverity;
  mobile_push?: boolean;
  fleet_push?: boolean;
  email?: boolean;
  digest_frequency?: AnomalyRuleDigest;
  /** Only the thresholds sent are changed; null goes back to the rule's own value. */
  parameter_defaults?: Record<string, number | null>;
}
