/**
 * Availability Module Types
 *
 * Tipos para gerenciamento de disponibilidade dos médicos
 */

/**
 * Tipo de dia da semana (formato da API: números 0-6)
 * 0 = Domingo, 1 = Segunda, 2 = Terça, 3 = Quarta, 4 = Quinta, 5 = Sexta, 6 = Sábado
 */
export type Weekday = 0 | 1 | 2 | 3 | 4 | 5 | 6;

/**
 * Tipo de atendimento
 */
export type AppointmentType = "presencial" | "telemedicina";

/**
 * Tipo de exceção
 */
export type ExceptionKind = "bloqueio" | "disponibilidade_extra";

/**
 * Interface para disponibilidade de médico (Supabase REST API)
 */
export interface DoctorAvailability {
  id?: string;
  doctor_id: string;
  weekday: Weekday; // 0=Domingo, 1=Segunda, 2=Terça, 3=Quarta, 4=Quinta, 5=Sexta, 6=Sábado
  start_time: string; // Formato: HH:MM (ex: "08:00")
  end_time: string; // Formato: HH:MM (ex: "18:00")
  slot_minutes?: number; // Default: 30, range: 15-120
  appointment_type?: AppointmentType; // Default: 'presencial'
  active?: boolean; // Default: true
  created_at?: string;
  updated_at?: string;
  created_by?: string;
  updated_by?: string;
}

/**
 * Interface para exceções de agenda
 */
export interface DoctorException {
  id?: string;
  doctor_id: string;
  date: string; // Formato: YYYY-MM-DD
  kind: ExceptionKind;
  start_time?: string | null; // null = dia inteiro
  end_time?: string | null; // null = dia inteiro
  reason?: string | null;
  created_at?: string;
  created_by?: string;
}

/**
 * Filtros para listagem de disponibilidades
 */
export interface ListAvailabilityFilters {
  doctor_id?: string;
  weekday?: Weekday; // 0=Domingo, 1=Segunda, ..., 6=Sábado
  active?: boolean;
  appointment_type?: AppointmentType;
  select?: string;
}

/**
 * Input para criar disponibilidade
 */
export interface CreateAvailabilityInput {
  doctor_id: string; // required
  weekday: Weekday; // required - 0=Domingo, 1=Segunda, ..., 6=Sábado
  start_time: string; // required - Formato: HH:MM (ex: "08:00")
  end_time: string; // required - Formato: HH:MM (ex: "18:00")
  slot_minutes?: number; // optional - Default: 30, range: 15-120
  appointment_type?: AppointmentType; // optional - Default: 'presencial'
  active?: boolean; // optional - Default: true
}

/**
 * Input para atualizar disponibilidade
 */
export interface UpdateAvailabilityInput {
  weekday?: Weekday;
  start_time?: string; // Formato: HH:MM
  end_time?: string; // Formato: HH:MM
  slot_minutes?: number;
  appointment_type?: AppointmentType;
  active?: boolean;
}

/**
 * Input para criar exceção
 */
export interface CreateExceptionInput {
  doctor_id: string;
  date: string; // Formato: YYYY-MM-DD
  kind: ExceptionKind;
  start_time?: string | null; // null = dia inteiro
  end_time?: string | null; // null = dia inteiro
  reason?: string | null;
  created_by: string;
}
