/**
 * Types TypeScript pour les clients - COOP-CA AMIFOND
 *
 * Types correspondant aux modèles Django backend pour les clients
 */

import { z } from "zod";

// Types correspondant au modèle Client Django
export type ClientStatus = "active" | "inactive" | "suspended" | "pending";
export type RiskProfile = "low" | "medium" | "high";
export type KYCStatus = "pending" | "in_progress" | "completed" | "rejected";

export interface ClientUser {
  id: number;
  email: string;
  first_name: string;
  last_name: string;
  phone_number?: string;
  user_type: string;
  is_active: boolean;
  is_verified: boolean;
  date_joined: string;
  // Champs du profil utilisateur
  date_of_birth?: string;
  gender?: "M" | "F" | "O";
  nationality?: string;
  address?: string;
  city?: string;
  country?: string;
  postal_code?: string;
}

export interface Client {
  id: number;
  client_number: string;
  is_member: boolean;
  membership_number?: string;
  membership_date?: string;
  account_manager?: {
    id: number;
    first_name: string;
    last_name: string;
    email: string;
  };
  status: ClientStatus;
  risk_profile?: RiskProfile;
  kyc_status?: KYCStatus;
  kyc_completion_date?: string;
  credit_score?: number;
  total_deposits: string; // Decimal en string depuis Django
  total_loans: string;
  total_shares: string;
  last_activity_date?: string;
  notes?: string;
  created_at: string;
  updated_at?: string;

  // Champs du ClientListSerializer (données sérialisées directement depuis le backend)
  full_name: string; // Source: user.get_full_name() - toujours présent dans la liste
  email: string; // Source: user.email - toujours présent dans la liste
  phone_number: string; // Source: user.phone_number - toujours présent dans la liste
  member_number_display: string; // Numéro de membre affiché ou "Non-membre"
  status_display: string; // Statut en format lisible
  credit_score_display: string; // Score en format lisible
  account_manager_name?: string; // Nom du gestionnaire de compte
  kyc_status_display?: string; // Statut KYC en format lisible

  // Champs optionnels pour le détail (peuvent être présents selon le serializer utilisé)
  user?: ClientUser; // Présent uniquement dans les vues détaillées
}

export interface ClientDocument {
  id: number;
  client: number;
  document_type: string;
  file_path: string;
  file_name: string;
  file_size?: number;
  uploaded_by: number;
  verified_by?: number;
  verification_date?: string;
  is_verified: boolean;
  notes?: string;
  created_at: string;
  updated_at: string;
}

export interface ClientContact {
  id: number;
  client: number;
  contact_type: string;
  first_name: string;
  last_name: string;
  relationship: string;
  phone_number?: string;
  email?: string;
  address?: string;
  is_emergency_contact: boolean;
  created_at: string;
  updated_at: string;
}

export interface ClientReferral {
  id: number;
  referrer: number;
  referred_client: number;
  referral_code?: string;
  commission_rate: string;
  commission_earned: string;
  status: string;
  referral_date: string;
  commission_paid_date?: string;
  notes?: string;
  created_at: string;
  updated_at: string;
}

export interface ClientActivity {
  id: number;
  client: number;
  activity_type: string;
  description: string;
  performed_by: number;
  ip_address?: string;
  user_agent?: string;
  created_at: string;
}

export interface MembershipHistory {
  id: number;
  client: number;
  action: string;
  previous_status?: string;
  new_status: string;
  effective_date: string;
  performed_by: number;
  reason?: string;
  notes?: string;
  created_at: string;
}

// Types pour les requêtes API
export interface ClientListParams {
  page?: number;
  page_size?: number;
  search?: string;
  is_member?: boolean;
  status?: ClientStatus;
  ordering?: string;
}

export interface ClientCreateRequest {
  // Champs utilisateur (requis pour créer l'utilisateur)
  first_name: string;
  last_name: string;
  email: string;
  phone_number: string;

  // Champs profil utilisateur (optionnels)
  date_of_birth?: string;
  gender?: "M" | "F" | "O";
  nationality?: string;
  address?: string;
  city?: string;
  country?: string;
  postal_code?: string;

  // Champs client
  account_manager: number;
  notes?: string;
  referrer_client_number?: string;

  // Données imbriquées optionnelles
  documents?: Array<{
    document_type: string;
    file?: File;
  }>;
  contacts?: Array<{
    first_name: string;
    last_name: string;
    relationship: string;
    phone_number: string;
    email?: string;
    is_emergency_contact?: boolean;
  }>;
}

export interface ClientUpdateRequest {
  // Champs utilisateur
  first_name?: string;
  last_name?: string;
  email?: string;
  phone_number?: string;

  // Champs profil utilisateur
  date_of_birth?: string;
  gender?: "M" | "F" | "O";
  nationality?: string;
  address?: string;
  city?: string;
  country?: string;
  postal_code?: string;

  // Champs client
  account_manager?: number;
  status?: ClientStatus;
  notes?: string;
}

export interface MemberConversionRequest {
  reason?: string;
  notes?: string;
}

export interface ClientStatsResponse {
  total_clients: number;
  active_clients: number;
  members: number;
  pending_kyc: number;
  total_deposits: string;
  total_loans: string;
  average_credit_score: number;
  new_clients_this_month: number;
  conversion_rate: number;
}

// Types pour les données de graphiques et évolution
export interface ClientEvolutionData {
  month: string;
  clients: number;
  new_clients: number;
  active_clients: number;
}

export interface ClientDashboardChartData {
  total_clients: Array<{ date: string; totalClients: number; active: number }>;
  new_clients: Array<{ date: string; newClients: number }>;
  active_clients: Array<{ month: string; clients: number }>;
}

export interface ClientReferralParams {
  page?: number;
  page_size?: number;
  search?: string;
  status?: string;
}

// Interface étendue pour les statistiques du dashboard
export interface ExtendedClientStats extends ClientStats {
  monthly_growth_rate?: number;
  activation_rate?: number;
  average_account_balance?: number;
  top_branch?: string;
  individual_clients?: number;
  business_clients?: number;
  pending_clients?: number;
  monthly_evolution?: ClientEvolutionData[];
  chart_data?: ClientDashboardChartData;
}

// Schémas Zod pour la validation
export const clientSchema = z.object({
  id: z.number(),
  client_number: z.string(),
  is_member: z.boolean(),
  membership_number: z.string().optional(),
  membership_date: z.string().optional(),
  account_manager: z
    .object({
      id: z.number(),
      first_name: z.string(),
      last_name: z.string(),
      email: z.string(),
    })
    .optional(),
  status: z.enum(["active", "inactive", "suspended", "pending"]),
  risk_profile: z.enum(["low", "medium", "high"]).optional(),
  kyc_status: z.enum(["pending", "in_progress", "completed", "rejected"]).optional(),
  kyc_completion_date: z.string().optional(),
  credit_score: z.number().optional(),
  total_deposits: z.string(),
  total_loans: z.string(),
  total_shares: z.string(),
  last_activity_date: z.string().optional(),
  notes: z.string().optional(),
  created_at: z.string(),
  updated_at: z.string().optional(),

  // Champs du ClientListSerializer (données directement disponibles)
  full_name: z.string(),
  email: z.string(),
  phone_number: z.string(),
  member_number_display: z.string(),
  status_display: z.string(),
  credit_score_display: z.string(),
  account_manager_name: z.string().optional(),
  kyc_status_display: z.string().optional(),

  // Champ optionnel pour les vues détaillées
  user: z
    .object({
      id: z.number(),
      email: z.string().email(),
      first_name: z.string(),
      last_name: z.string(),
      phone_number: z.string().optional(),
      user_type: z.string(),
      is_active: z.boolean(),
      is_verified: z.boolean(),
      date_joined: z.string(),
    })
    .optional(),
});

export const clientListResponseSchema = z.object({
  count: z.number(),
  next: z.string().nullable(),
  previous: z.string().nullable(),
  results: z.array(clientSchema),
});

export const clientStatsSchema = z.object({
  total_clients: z.number(),
  active_clients: z.number(),
  members: z.number(),
  pending_kyc: z.number(),
  total_deposits: z.string(),
  total_loans: z.string(),
  average_credit_score: z.number(),
  new_clients_this_month: z.number(),
  conversion_rate: z.number(),
});

export type ClientListResponse = z.infer<typeof clientListResponseSchema>;
export type ClientStats = z.infer<typeof clientStatsSchema>;
