import { z } from 'zod';

export const AlcadaDescontoItemSchema = z.object({
  codVendedor: z.number().int(),
  codGrupo: z.number().int(),
  limitePerc: z.number(),
  nomeVendedor: z.string().nullable(),
});
export type AlcadaDescontoItem = z.infer<typeof AlcadaDescontoItemSchema>;

export const AlcadaDescontosResponseSchema = z.object({
  descontos: z.array(AlcadaDescontoItemSchema),
});
export type AlcadaDescontosResponse = z.infer<typeof AlcadaDescontosResponseSchema>;

export const UpsertDescontoBodySchema = z.object({
  codVendedor: z.number().int().positive(),
  codGrupo: z.number().int().default(0),
  limitePerc: z.number().min(0).max(100),
});
export type UpsertDescontoBody = z.infer<typeof UpsertDescontoBodySchema>;

export const PromocaoSchema = z.object({
  id: z.number().int(),
  descricao: z.string(),
  codProduto: z.string().nullable(),
  grpProd: z.string().nullable(),
  descPct: z.number(),
  dataInicio: z.string(),
  dataFim: z.string(),
  ativa: z.boolean(),
  createdAt: z.string(),
  createdBy: z.string(),
});
export type Promocao = z.infer<typeof PromocaoSchema>;

export const PromocoesResponseSchema = z.object({
  promocoes: z.array(PromocaoSchema),
});
export type PromocoesResponse = z.infer<typeof PromocoesResponseSchema>;

export const CreatePromocaoBodySchema = z.object({
  descricao: z.string().min(1).max(255),
  codProduto: z.string().optional(),
  grpProd: z.string().optional(),
  descPct: z.number().min(0).max(100),
  dataInicio: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
  dataFim: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
});
export type CreatePromocaoBody = z.infer<typeof CreatePromocaoBodySchema>;

export const UpdatePromocaoBodySchema = CreatePromocaoBodySchema.partial().extend({
  ativa: z.boolean().optional(),
});
export type UpdatePromocaoBody = z.infer<typeof UpdatePromocaoBodySchema>;

// ─── Regras de Desconto ───────────────────────────────────────────────────────
// Regra criada pelo Gerente: % de desconto liberado por grupo e/ou subgrupo de
// produto e/ou representante, com vigência. Campos nulos = "todos".

export const RegraDescontoSchema = z.object({
  id: z.number().int(),
  descricao: z.string(),
  codGrupo: z.number().int().nullable(),
  grupo: z.string().nullable(),
  codSubgrupo: z.number().int().nullable(),
  subgrupo: z.string().nullable(),
  codVendedor: z.number().int().nullable(),
  nomeVendedor: z.string().nullable(),
  descPct: z.number(),
  dataInicio: z.string(),
  dataFim: z.string(),
  ativa: z.boolean(),
  createdAt: z.string(),
  createdBy: z.string(),
});
export type RegraDesconto = z.infer<typeof RegraDescontoSchema>;

export const RegrasDescontoResponseSchema = z.object({
  regras: z.array(RegraDescontoSchema),
});
export type RegrasDescontoResponse = z.infer<typeof RegrasDescontoResponseSchema>;

export const CreateRegraDescontoBodySchema = z.object({
  descricao: z.string().min(1).max(200),
  codGrupo: z.number().int().nullable().optional(),
  codSubgrupo: z.number().int().nullable().optional(),
  codVendedor: z.number().int().nullable().optional(),
  descPct: z.number().min(0).max(100),
  dataInicio: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
  dataFim: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
});
export type CreateRegraDescontoBody = z.infer<typeof CreateRegraDescontoBodySchema>;

export const UpdateRegraDescontoBodySchema = CreateRegraDescontoBodySchema.partial().extend({
  ativa: z.boolean().optional(),
});
export type UpdateRegraDescontoBody = z.infer<typeof UpdateRegraDescontoBodySchema>;

// Alçada do usuário logado — usada pelo carrinho para mostrar o teto por item
export const AlcadaRepItemSchema = z.object({
  codGrupo: z.number().int(),
  limitePerc: z.number(),
});
export type AlcadaRepItem = z.infer<typeof AlcadaRepItemSchema>;

export const AlcadaRepResponseSchema = z.object({
  limites: z.array(AlcadaRepItemSchema),
});
export type AlcadaRepResponse = z.infer<typeof AlcadaRepResponseSchema>;

// Promoções vigentes hoje — visíveis ao rep para sinalizar condição no catálogo
export const PromocaoVigenteSchema = z.object({
  id: z.number().int(),
  descricao: z.string(),
  codProduto: z.string().nullable(),
  grpProd: z.string().nullable(),
  descPct: z.number(),
  dataFim: z.string(),
});
export type PromocaoVigente = z.infer<typeof PromocaoVigenteSchema>;

export const PromocoesVigentesResponseSchema = z.object({
  promocoes: z.array(PromocaoVigenteSchema),
});
export type PromocoesVigentesResponse = z.infer<typeof PromocoesVigentesResponseSchema>;

// Regras vigentes para o representante logado — aplicadas na montagem do pedido
export const RegraVigenteSchema = z.object({
  id: z.number().int(),
  descricao: z.string(),
  codGrupo: z.number().int().nullable(),
  codSubgrupo: z.number().int().nullable(),
  descPct: z.number(),
  dataFim: z.string(),
});
export type RegraVigente = z.infer<typeof RegraVigenteSchema>;

export const RegrasVigentesResponseSchema = z.object({
  regras: z.array(RegraVigenteSchema),
});
export type RegrasVigentesResponse = z.infer<typeof RegrasVigentesResponseSchema>;

// Grupos/subgrupos de produto (combos do formulário do gerente)
export const GrupoProdutoItemSchema = z.object({
  codGrupo: z.number().int().nullable(),
  grupo: z.string().nullable(),
  codSubgrupo: z.number().int().nullable(),
  subgrupo: z.string().nullable(),
});
export type GrupoProdutoItem = z.infer<typeof GrupoProdutoItemSchema>;

export const GruposProdutoResponseSchema = z.object({
  grupos: z.array(GrupoProdutoItemSchema),
});
export type GruposProdutoResponse = z.infer<typeof GruposProdutoResponseSchema>;
