export type OrderStatus = 'pending_production' | 'in_production' | 'finished' | 'delivered' | 'canceled';
export type FinancialStatus = 'unpaid' | 'partially_paid' | 'paid';
export type PaymentMethod = 'pix' | 'cash' | 'credit_card' | 'debit_card' | 'transfer';

export interface Payment {
  id: string;
  created_at: string;
  user_id: string;
  order_id: string;
  bank_account_id?: string | null;
  amount: number;
  payment_method: PaymentMethod;
  payment_date: string;
  notes?: string;
  created_by?: string | null;
}

export interface Order {
  id: string;
  created_at: string;
  updated_at: string;
  user_id: string;
  client_id: string;
  quote_id: string;
  number: number;
  status: OrderStatus;
  total_amount: number;
  paid_amount: number;
  financial_status: FinancialStatus;
  /* Prazo prometido ao cliente. Herdado do orcamento na conversao, e opcional:
     venda de balcao no PDV nao tem prazo. */
  delivery_date?: string | null;
  /* As condições comerciais combinadas na proposta, copiadas do orçamento na
     aprovação (retrato: mudar o orçamento depois não muda o pedido). O
     formato é o de lib/condicoes-comerciais.ts. */
  payment_terms?: unknown;
  notes?: string;
  internal_notes?: string;
  approval_signature?: string | null;
  approval_signed_at?: string | null;
  approval_signed_name?: string | null;
  created_by?: string | null;
  production_started_at?: string | null;
  production_started_by?: string | null;
  production_accumulated_seconds?: number;
  production_last_stopped_at?: string | null;
  production_updated_at?: string | null;
  production_stage_id?: string | null;
  /* Primeiro início e conclusão da produção: colunas que ninguém zera, ao
     contrário de production_started_at, que volta a nulo ao pausar. */
  production_first_started_at?: string | null;
  production_finished_at?: string | null;
  share_token?: string | null;
  share_enabled?: boolean | null;
  shipping_tracking_codes?: string[] | null;
  shipping_tracking_url?: string | null;
  shipping_tracking_notes?: string | null;
  shipping_tracking_updated_at?: string | null;
  /* Recado da loja que aparece no portal do cliente (substituido pela conversa,
     mantido para pedidos antigos). */
  client_message?: string | null;
  client_message_at?: string | null;
  /* Resposta do cliente sobre a arte enviada na conversa. */
  art_status?: "pending" | "approved" | "rejected" | null;
  art_approved_at?: string | null;
  restock_pending?: boolean;
  // Joins
  clients?: {
    name: string;
    company_name?: string | null;
    active?: boolean | null;
    is_deleted?: boolean | null;
  } | null;
  quotes?: {
    id: string;
    number: number;
  } | null;
}

export interface OrderItem {
  id: string;
  created_at: string;
  order_id: string;
  product_id?: string;
  title: string;
  description?: string;
  quantity: number;
  unit_price: number;
  total_price: number;
  unit_type: string;
  width_m?: number;
  height_m?: number;
  length_m?: number;
  restock_pending?: boolean;
  restock_shortage_qty?: number;
  /* O custo unitário calculado na venda e o retrato da precificação
     (custo_total, margem, preço) congelado no item. */
  calculated_cost?: number | null;
  pricing_snapshot?: unknown;
  /* Valor mínimo do item (migration 194): veio do orçamento. */
  valor_minimo_aplicado?: number | string | null;
  valor_sem_minimo?: number | string | null;
  products?: {
    sku?: string | null;
    barcode?: string | null;
  } | null;
}

export interface OrderHistory {
  id: string;
  created_at: string;
  order_id: string;
  user_id: string;
  status_from?: string;
  status_to: OrderStatus;
  notes?: string;
  // Joins
  users?: {
    full_name: string;
    email: string;
  };
}
