import { z } from 'zod';

export const TIPOS_CHAMADO = [
  'avaria',
  'quantidade_divergente',
  'produto_errado',
  'prazo_entrega',
  'outro',
] as const;

export const STATUS_CHAMADO = [
  'aberto',
  'em_analise',
  'aguardando_rep',
  'resolvido',
  'cancelado',
] as const;

export const RESOLUCAO_CHAMADO = [
  'reposicao',
  'desconto',
  'cancelamento_item',
  'sem_acao',
  'outro',
] as const;

export const TIPO_CHAMADO_LABEL: Record<string, string> = {
  avaria: 'Avaria / Dano',
  quantidade_divergente: 'Quantidade Divergente',
  produto_errado: 'Produto Errado',
  prazo_entrega: 'Prazo de Entrega',
  outro: 'Outro',
};

export const STATUS_CHAMADO_LABEL: Record<string, string> = {
  aberto: 'Aberto',
  em_analise: 'Em Análise',
  aguardando_rep: 'Aguardando Rep.',
  resolvido: 'Resolvido',
  cancelado: 'Cancelado',
};

export const RESOLUCAO_CHAMADO_LABEL: Record<string, string> = {
  reposicao: 'Reposição do Item',
  desconto: 'Desconto / Abatimento',
  cancelamento_item: 'Cancelamento do Item',
  sem_acao: 'Sem Ação Necessária',
  outro: 'Outro',
};

export const ItemAfetadoSchema = z.object({
  codProduto: z.string(),
  nomeProduto: z.string(),
  qtd: z.number(),
});

export const ChamadoMensagemSchema = z.object({
  id: z.number(),
  idChamado: z.number(),
  autor: z.enum(['rep', 'empresa']),
  texto: z.string(),
  createdAt: z.string(),
});

export const ChamadoSchema = z.object({
  id: z.number(),
  idEmpresa: z.number(),
  codVendedor: z.number(),
  idPedido: z.string().nullable().optional(),
  numPedSar: z.number().nullable().optional(),
  numPedErp: z.number().nullable().optional(),
  idCliente: z.number(),
  nomeCliente: z.string().nullable().optional(),
  tipo: z.string(),
  assunto: z.string(),
  descricao: z.string(),
  status: z.string(),
  resolucao: z.string().nullable().optional(),
  notaResolucao: z.string().nullable().optional(),
  itensAfetados: z.array(ItemAfetadoSchema).nullable().optional(),
  createdAt: z.string(),
  updatedAt: z.string(),
  mensagens: z.array(ChamadoMensagemSchema).optional(),
});

export const CreateChamadoSchema = z.object({
  idPedido: z.string().uuid().optional(),
  numPedSar: z.number().int().positive().optional(),
  numPedErp: z.number().int().positive().optional(),
  nomeCliente: z.string().optional(),
  idCliente: z.number().int().positive(),
  tipo: z.enum(TIPOS_CHAMADO),
  assunto: z.string().min(5).max(200),
  descricao: z.string().min(10),
  itensAfetados: z.array(ItemAfetadoSchema).optional(),
});

export const AddMensagemSchema = z.object({
  texto: z.string().min(1).max(2000),
});

export const ResolverChamadoSchema = z.object({
  resolucao: z.enum(RESOLUCAO_CHAMADO),
  notaResolucao: z.string().optional(),
  mensagemFinal: z.string().optional(),
});

export const CancelChamadoSchema = z.object({
  motivo: z.string().optional(),
});

export const ChamadoListResponseSchema = z.object({
  abertos: z.array(ChamadoSchema),
  fechados: z.array(ChamadoSchema),
});

export type TipoChamado = (typeof TIPOS_CHAMADO)[number];
export type StatusChamado = (typeof STATUS_CHAMADO)[number];
export type ResolucaoChamado = (typeof RESOLUCAO_CHAMADO)[number];
export type ItemAfetado = z.infer<typeof ItemAfetadoSchema>;
export type ChamadoMensagem = z.infer<typeof ChamadoMensagemSchema>;
export type Chamado = z.infer<typeof ChamadoSchema>;
export type CreateChamadoDto = z.infer<typeof CreateChamadoSchema>;
export type AddMensagemDto = z.infer<typeof AddMensagemSchema>;
export type ResolverChamadoDto = z.infer<typeof ResolverChamadoSchema>;
export type CancelChamadoDto = z.infer<typeof CancelChamadoSchema>;
export type ChamadoListResponse = z.infer<typeof ChamadoListResponseSchema>;
