export type TariffLevel = {
  id: string;
  label: string;
  reference: string;
  min?: number;
  max?: number;
  hint?: string;
};

export type TariffWorkType = {
  id: string;
  label: string;
  shortLabel: string;
  hourReference?: string;
  levels: TariffLevel[];
};

export type TariffCatalogItem = {
  id: string;
  section: string;
  category: string;
  service: string;
  notes?: string;
  workTypes: TariffWorkType[];
};

export const TARIFF_SECTIONS = [
  { id: "grafico", label: "Tarifario Gráfico CDC" },
  { id: "estrategia", label: "Estrategia y Creatividad" },
] as const;

export const WORK_TYPE_DESIGN = "design_final_art";
export const WORK_TYPE_ADAPTATION = "adaptation_final_art";
export const WORK_TYPE_REFERENCE = "reference";
export const WMC_TARIFF_SECTION = "wmc" as const;
export const WMC_FIXED_WORK_TYPE = "wmc_fixed";
export const WMC_FIXED_LEVEL = "fixed";

function level(
  id: string,
  label: string,
  reference: string,
  min?: number,
  max?: number,
  hint?: string,
): TariffLevel {
  return { id, label, reference, min, max, hint };
}

function graphicWorkTypes({
  designHour = "35 - 50",
  adaptationHour = "30",
  design,
  adaptation,
}: {
  designHour?: string;
  adaptationHour?: string;
  design: TariffLevel[];
  adaptation?: TariffLevel[];
}): TariffWorkType[] {
  const workTypes: TariffWorkType[] = [
    {
      id: WORK_TYPE_DESIGN,
      label: "Diseño + Entregable Arte Final",
      shortLabel: "Diseño + AF",
      hourReference: designHour,
      levels: design,
    },
  ];

  if (adaptation?.length) {
    workTypes.push({
      id: WORK_TYPE_ADAPTATION,
      label: "Adaptación Arte Final",
      shortLabel: "Adaptación AF",
      hourReference: adaptationHour,
      levels: adaptation,
    });
  }

  return workTypes;
}

function wmcFixedItem({
  id,
  service,
  amount,
  description,
  equivalent,
  observations,
}: {
  id: string;
  service: string;
  amount: number;
  description: string;
  equivalent: string;
  observations: string;
}): TariffCatalogItem {
  const notes = [
    description,
    equivalent ? `Equivalencia CDC: ${equivalent}.` : "",
    observations,
  ]
    .filter(Boolean)
    .join(" ");

  return {
    id,
    section: WMC_TARIFF_SECTION,
    category: "Walmart Connect",
    service,
    notes,
    workTypes: [
      {
        id: WMC_FIXED_WORK_TYPE,
        label: "Tarifa fija WMC",
        shortLabel: "WMC",
        hourReference: "35 - 80",
        levels: [
          level(
            WMC_FIXED_LEVEL,
            "Precio fijo",
            `${amount} USD`,
            amount,
            amount,
            observations,
          ),
        ],
      },
    ],
  };
}

export const TARIFF_CATALOG: TariffCatalogItem[] = [
  {
    id: "pdv-materiales-basicos",
    section: "grafico",
    category: "Materiales de PDV estándar",
    service:
      "Cenefas, habladores, danglers, rompetráficos, afiches, backings, rollups, uniformes, piezas WhatsApp/web",
    notes:
      "Incluye diseño en alta resolución, troqueles y 3 rondas de cambios. Cambios adicionales pueden agregarse como Otros.",
    workTypes: graphicWorkTypes({
      design: [
        level("basic", "Básico", "50 - 80", 50, 80),
        level("intermediate", "Intermedio", "100 - 150", 100, 150),
        level("advanced", "Avanzado", "150 - 300", 150, 300),
      ],
      adaptation: [
        level("basic", "Básico", "30 - 50", 30, 50),
        level("intermediate", "Intermedio", "60 - 80", 60, 80),
        level("advanced", "Avanzado", "100 - 150", 100, 150),
      ],
    }),
  },
  {
    id: "pdv-promocion-pack",
    section: "grafico",
    category: "Promoción en PDV",
    service: "Quick counter + roll up + mecánica de canje + uniforme (pack 3 a 5 piezas o más)",
    notes:
      "Montos por paquete de 3 a 5 piezas. Piezas o solicitudes extra deben agregarse como Otros.",
    workTypes: graphicWorkTypes({
      design: [
        level("basic", "Básico", "320 - 500", 320, 500),
        level("intermediate", "Intermedio", "500 - 700", 500, 700),
        level("advanced", "Avanzado", "800 - 1000", 800, 1000),
      ],
      adaptation: [
        level("basic", "Básico", "200 - 350", 200, 350),
        level("intermediate", "Intermedio", "350 - 550", 350, 550),
        level(
          "advanced",
          "Avanzado",
          "600 - 800+",
          600,
          800,
          "Puede superar el rango si el caso lo requiere.",
        ),
      ],
    }),
  },
  {
    id: "ooh-gigantografias",
    section: "grafico",
    category: "OOH y gigantografías",
    service: "Vallas, mupies y gigantografías",
    notes: "Los niveles están asociados a tamaño aproximado: 6m², más de 10m² y más de 20m².",
    workTypes: graphicWorkTypes({
      design: [
        level("basic", "6m² aprox", "250 - 350", 250, 350),
        level("intermediate", "Más 10m²", "400 - 650", 400, 650),
        level("advanced", "Más de 20m²", "700 - 1100", 700, 1100),
      ],
      adaptation: [
        level("basic", "6m² aprox", "100 - 150", 100, 150),
        level("intermediate", "Más 10m²", "200 - 300", 200, 300),
        level("advanced", "Más de 20m²", "400 - 600", 400, 600),
      ],
    }),
  },
  {
    id: "stands-muebles-exhibidores",
    section: "grafico",
    category: "Stands, muebles y exhibidores",
    service: "One Way, cabeceras de góndola, revestimiento de islas y displays básicos",
    notes: "Incluye diseño en alta resolución, troqueles y 3 rondas de cambios.",
    workTypes: graphicWorkTypes({
      design: [
        level("basic", "Básico", "300 - 400", 300, 400),
        level("intermediate", "Intermedio", "450 - 650", 450, 650),
        level("advanced", "Avanzado", "700 - 1000", 700, 1000),
      ],
      adaptation: [
        level("basic", "Básico", "200 - 300", 200, 300),
        level("intermediate", "Intermedio", "300 - 400", 300, 400),
        level("advanced", "Avanzado", "450 - 600", 450, 600),
      ],
    }),
  },
  {
    id: "proyectos-especiales-muebles",
    section: "grafico",
    category: "Proyectos especiales",
    service:
      "Diseño de muebles u otros proyectos especiales con planos estructurales y troqueles desde cero",
    notes:
      "Precio por proyecto. Incluye diseño gráfico/estructural, planos, troqueles, conceptualización y 4 rondas de cambios.",
    workTypes: graphicWorkTypes({
      design: [level("project", "Precio único", "1000 - 1500", 1000, 1500)],
      adaptation: [level("project", "Precio único", "600 - 850", 600, 850)],
    }),
  },
  {
    id: "stands-creativos-eventos",
    section: "grafico",
    category: "Proyectos especiales",
    service:
      "Stands creativos para ferias/eventos, montaje de eventos especiales y diseños de espacios especiales",
    notes:
      "Precio por proyecto. Incluye stand creativo, planos estructurales, visualizaciones 3D y 4 rondas de cambios.",
    workTypes: graphicWorkTypes({
      design: [level("project", "Precio único", "1500 - 3000", 1500, 3000)],
      adaptation: [level("project", "Precio único", "800 - 1200", 800, 1200)],
    }),
  },
  {
    id: "empaque-simple",
    section: "grafico",
    category: "Diseño de empaques",
    service: "Empaque simple",
    notes: "Diseño gráfico original para empaques simples sin troqueles complejos.",
    workTypes: graphicWorkTypes({
      design: [level("project", "Precio único", "700 - 1000", 700, 1000)],
      adaptation: [level("project", "Adaptación / SKU", "100 - 300", 100, 300)],
    }),
  },
  {
    id: "empaque-complejo",
    section: "grafico",
    category: "Diseño de empaques",
    service: "Empaque complejo",
    notes:
      "Diseño gráfico y estructural para empaques con troqueles personalizados o formas no convencionales.",
    workTypes: graphicWorkTypes({
      design: [level("project", "Precio único", "1000 - 1500", 1000, 1500)],
      adaptation: [level("project", "Adaptación / SKU", "100 - 300", 100, 300)],
    }),
  },
  {
    id: "brochures",
    section: "grafico",
    category: "Catálogos, brochures y folletos",
    service: "Brochures",
    notes: "Incluye diseño y 3 rondas de cambios.",
    workTypes: graphicWorkTypes({
      design: [
        level("basic", "Básico", "200 - 400", 200, 400),
        level("intermediate", "Intermedio", "400 - 600", 400, 600),
        level("advanced", "Avanzado", "600 - 800", 600, 800),
      ],
      adaptation: [
        level("basic", "Básico", "50 - 100", 50, 100),
        level("intermediate", "Intermedio", "100 - 150", 100, 150),
        level("advanced", "Avanzado", "150 - 350", 150, 350),
      ],
    }),
  },
  {
    id: "catalogos-folletos-pagina",
    section: "grafico",
    category: "Catálogos, brochures y folletos",
    service: "Catálogos y folletos (costo por página)",
    notes: "Costo por página. Incluye diseño y 3 rondas de cambios.",
    workTypes: graphicWorkTypes({
      design: [
        level("basic", "Básico", "30 - 60", 30, 60),
        level("intermediate", "Intermedio", "60 - 90", 60, 90),
        level("advanced", "Avanzado", "90 - 120", 90, 120),
      ],
      adaptation: [
        level("basic", "Básico", "15 - 30", 15, 30),
        level("intermediate", "Intermedio", "30 - 60", 30, 60),
        level("advanced", "Avanzado", "60 - 100", 60, 100),
      ],
    }),
  },
  {
    id: "web-landing",
    section: "grafico",
    category: "Páginas web",
    service: "Landing page o sitio simple hasta 5 páginas",
    notes:
      "Sitio web básico con diseño estático, contenido del cliente y hasta 2 rondas de cambios.",
    workTypes: [
      {
        id: WORK_TYPE_REFERENCE,
        label: "Diseño web",
        shortLabel: "Web",
        hourReference: "35 - 50",
        levels: [level("project", "Precio único", "800 - 1500", 800, 1500)],
      },
    ],
  },
  {
    id: "web-intermedio",
    section: "grafico",
    category: "Páginas web",
    service: "Sitio corporativo intermedio de 6 a 15 páginas",
    notes:
      "Sitio mediano con páginas adicionales y diseño más personalizado. Hasta 3 rondas de cambios.",
    workTypes: [
      {
        id: WORK_TYPE_REFERENCE,
        label: "Diseño web",
        shortLabel: "Web",
        hourReference: "35 - 50",
        levels: [level("project", "Precio único", "2000 - 5000", 2000, 5000)],
      },
    ],
  },
  {
    id: "web-avanzado",
    section: "grafico",
    category: "Páginas web",
    service: "Sitio avanzado: más de 15 páginas, interactividad o integraciones complejas",
    notes: "Incluye desarrollo a medida y hasta 5 rondas de cambios.",
    workTypes: [
      {
        id: WORK_TYPE_REFERENCE,
        label: "Diseño web",
        shortLabel: "Web",
        hourReference: "36 - 50",
        levels: [level("project", "Precio único", "4000 - 8000", 4000, 8000)],
      },
    ],
  },
  {
    id: "retoques-fotograficos",
    section: "grafico",
    category: "Otros servicios",
    service: "Retoques fotográficos",
    notes: "Incluye 2 rondas de ajustes.",
    workTypes: graphicWorkTypes({
      design: [
        level("basic", "Básico", "20 - 40", 20, 40),
        level("intermediate", "Intermedio", "50 - 100", 50, 100),
        level("advanced", "Avanzado", "150 - 300", 150, 300),
      ],
      adaptation: undefined,
    }),
  },
  {
    id: "videos",
    section: "grafico",
    category: "Otros servicios",
    service: "Videos",
    notes: "Referencia por complejidad del video.",
    workTypes: graphicWorkTypes({
      designHour: "35 - 50",
      design: [
        level("basic", "Básico", "100 - 250", 100, 250),
        level("intermediate", "Intermedio", "250 - 500", 250, 500),
        level("advanced", "Avanzado", "500 - 1200", 500, 1200),
      ],
    }),
  },
  {
    id: "copy-puntual",
    section: "grafico",
    category: "Otros servicios",
    service: "Copy puntual para ADS, tarjetas o comunicaciones sueltas",
    notes: "Solo copy puntual. Si requiere concepto, presupuestar según proyecto/hora hombre.",
    workTypes: graphicWorkTypes({
      designHour: "1 - 25",
      design: [
        level("basic", "Básico", "100", 100, 100),
        level("intermediate", "Intermedio", "100 - 200", 100, 200),
        level("advanced", "Avanzado", "200 - 500", 200, 500),
      ],
    }),
  },
  {
    id: "render-sencillo",
    section: "grafico",
    category: "Otros servicios",
    service: "Render sencillo de 1 solo plano por unidad",
    notes: "No aplica para eventos donde hay que conceptualizar el ambiente total.",
    workTypes: graphicWorkTypes({
      designHour: "1 - 50",
      design: [
        level("basic", "Básico", "100", 100, 100),
        level("intermediate", "Intermedio", "100 - 150", 100, 150),
        level("advanced", "Avanzado", "150 - 300", 150, 300),
      ],
    }),
  },
  {
    id: "carnets",
    section: "grafico",
    category: "Otros servicios",
    service: "Carnets",
    notes:
      "Referencia especial: diseño base + réplicas. El Director Creativo calcula y escribe el monto final manualmente.",
    workTypes: [
      {
        id: WORK_TYPE_REFERENCE,
        label: "Referencia manual",
        shortLabel: "Manual",
        levels: [
          level("base", "Diseño base", "20 base", 20, 20),
          level("replica", "Réplicas", "5 por réplica", 5, 5),
        ],
      },
    ],
  },
  {
    id: "identidad-basica",
    section: "estrategia",
    category: "Desarrollo de Identidad Gráfica para Marca",
    service: "Desarrollo básico para pequeñas marcas o emprendimientos",
    notes:
      "Incluye logo, paleta, tipografía, identidad visual básica, hasta 2 conceptos y 3 rondas de cambios.",
    workTypes: [
      {
        id: WORK_TYPE_REFERENCE,
        label: "Tarifa fija",
        shortLabel: "Fija",
        levels: [level("project", "Básico", "2000 - 4000", 2000, 4000)],
      },
    ],
  },
  {
    id: "identidad-intermedia",
    section: "estrategia",
    category: "Desarrollo de Identidad Gráfica para Marca",
    service: "Desarrollo intermedio para marcas medianas",
    notes:
      "Incluye nombre si aplica, logotipo, paleta, tipografía, key visuals y manual de marca detallado.",
    workTypes: [
      {
        id: WORK_TYPE_REFERENCE,
        label: "Tarifa fija",
        shortLabel: "Fija",
        levels: [level("project", "Intermedio", "4000 - 8000", 4000, 8000)],
      },
    ],
  },
  {
    id: "identidad-avanzada",
    section: "estrategia",
    category: "Desarrollo de Identidad Gráfica para Marca",
    service: "Desarrollo avanzado para grandes marcas o redes",
    notes:
      "Identidad visual robusta con aplicaciones de marca, investigación, key visuals y manual exhaustivo.",
    workTypes: [
      {
        id: WORK_TYPE_REFERENCE,
        label: "Tarifa fija",
        shortLabel: "Fija",
        levels: [level("project", "Avanzado", "8000 - 15000 o más", 8000, 15000)],
      },
    ],
  },
  {
    id: "campana-key-visual-basica",
    section: "estrategia",
    category: "Desarrollo de Campaña Creativa",
    service: "Concepto y Key Visual básico para campañas pequeñas",
    notes:
      "Concepto creativo básico, key visual, línea gráfica y eslogan con aplicaciones limitadas.",
    workTypes: [
      {
        id: WORK_TYPE_REFERENCE,
        label: "Tarifa fija",
        shortLabel: "Fija",
        levels: [level("project", "Básico", "2000 - 3000", 2000, 3000)],
      },
    ],
  },
  {
    id: "campana-creativa-intermedia",
    section: "estrategia",
    category: "Desarrollo de Campaña Creativa",
    service: "Campaña creativa intermedia para lanzamientos medianos",
    notes: "Concepto creativo completo, key visuals, eslogan y piezas para distintos medios.",
    workTypes: [
      {
        id: WORK_TYPE_REFERENCE,
        label: "Tarifa fija",
        shortLabel: "Fija",
        levels: [level("project", "Intermedio", "3000 - 5000", 3000, 5000)],
      },
    ],
  },
  {
    id: "campana-creativa-avanzada",
    section: "estrategia",
    category: "Desarrollo de Campaña Creativa",
    service: "Campaña creativa avanzada para lanzamientos grandes",
    notes:
      "Desarrollo estratégico y creativo de campaña grande con insights, key visuals y múltiples piezas.",
    workTypes: [
      {
        id: WORK_TYPE_REFERENCE,
        label: "Tarifa fija",
        shortLabel: "Fija",
        levels: [level("project", "Avanzado", "5000 - 8000 o más", 5000, 8000)],
      },
    ],
  },
  {
    id: "consultoria-estrategica",
    section: "estrategia",
    category: "Desarrollo Estratégico y Conceptual",
    service: "Consultoría estratégica y desarrollo de concepto",
    notes:
      "Investigación de mercado, análisis de competencia, concepto estratégico y alineación con objetivos del cliente.",
    workTypes: [
      {
        id: WORK_TYPE_REFERENCE,
        label: "Tarifa fija o por hora",
        shortLabel: "Referencia",
        levels: [
          level("project", "Por proyecto", "1500 - 3000", 1500, 3000),
          level("hour", "Por hora", "100 - 200 por hora", 100, 200),
        ],
      },
    ],
  },
  {
    id: "rondas-adicionales-estrategia",
    section: "estrategia",
    category: "Adicionales estratégicos",
    service: "Rondas adicionales de cambios",
    notes: "Referencia para trabajo adicional en estrategia o creatividad.",
    workTypes: [
      {
        id: WORK_TYPE_REFERENCE,
        label: "Por hora",
        shortLabel: "Hora",
        levels: [level("hour", "Por hora", "50 - 150 por hora", 50, 150)],
      },
    ],
  },
  wmcFixedItem({
    id: "wmc-uniformes",
    service: "Uniformes",
    amount: 80,
    description:
      "Uniforme completo para personal de impulso en piso (playera/top, jogger, falda, chaleco), con 4 variantes de diseño exploradas.",
    equivalent: "Materiales de PDV estándar y otros materiales básicos > Uniformes",
    observations: "Incluye diseño en alta resolución y 3 rondas de cambios.",
  }),
  wmcFixedItem({
    id: "wmc-uniformes-supervisor",
    service: "Uniformes – Supervisor",
    amount: 100,
    description:
      "Uniforme para supervisor de piso (polo, chumpa/track jacket, camisa formal), con 3 variantes de diseño exploradas.",
    equivalent: "Materiales de PDV estándar y otros materiales básicos > Uniformes",
    observations: "Incluye diseño en alta resolución y 3 rondas de cambios.",
  }),
  wmcFixedItem({
    id: "wmc-glorificador-mano",
    service: "Glorificador de mano",
    amount: 150,
    description:
      "Exhibidor portátil pequeño para presentar el producto: bandeja iluminada, aro LED, estuche o base acrílica.",
    equivalent: "Stands, Muebles y Exhibidores > Estándar (Displays básicos)",
    observations: "Incluye diseño 3D, troqueles y 3 rondas de cambios.",
  }),
  wmcFixedItem({
    id: "wmc-carritos-intervenidos",
    service: "Carritos intervenidos",
    amount: 200,
    description:
      "Vinil o calcomanía de marca aplicada a la canasta y al mango del carrito de compras.",
    equivalent:
      "Materiales de PDV estándar y otros materiales básicos (análogo a Backings/Rompetráficos)",
    observations:
      "Pieza análoga a material gráfico estándar aplicado sobre una superficie existente.",
  }),
  wmcFixedItem({
    id: "wmc-dummies-exhibicion",
    service: "Dummies de exhibición",
    amount: 200,
    description:
      "Réplica escultórica a gran escala de pasta y cepillo dental como punto focal decorativo o táctil.",
    equivalent:
      "Proyectos especiales > Diseño de muebles / proyectos con planos y troqueles desde cero",
    observations: "Requiere diseño estructural y visualización 3D; no es solo arte de impresión.",
  }),
  wmcFixedItem({
    id: "wmc-photobooth",
    service: "Photobooth",
    amount: 200,
    description:
      "Estructura tipo arco con iluminación LED y espacio fotográfico de marca para activaciones.",
    equivalent: "Proyectos especiales > Diseño de Stands Creativos para ferias o eventos",
    observations: "Estructura autoportante con iluminación, ambientación y 4 rondas de cambios.",
  }),
  wmcFixedItem({
    id: "wmc-play-station",
    service: "Play Station",
    amount: 200,
    description: "Kiosco interactivo con pantalla táctil y mecánica de juego.",
    equivalent: "Proyectos especiales > Diseño de muebles / proyectos especiales",
    observations:
      "Incluye diseño de mueble e interfaz gráfica; el desarrollo funcional del juego se cotiza aparte.",
  }),
  wmcFixedItem({
    id: "wmc-isla-wm",
    service: "Isla WM",
    amount: 150,
    description:
      "Mueble isla completo multinivel con iluminación, gráficos y espacio de exhibición de la línea completa de producto.",
    equivalent: "Proyectos especiales > Diseño de Stands Creativos para ferias o eventos",
    observations: "Mayor escala y complejidad estructural dentro del set de piezas.",
  }),
  wmcFixedItem({
    id: "wmc-exhibicion-especial",
    service: "Exhibición Especial",
    amount: 250,
    description: "Propuesta de muebles de exhibición.",
    equivalent: "Proyectos especiales > Diseño de muebles con planos y troqueles desde cero",
    observations:
      "Costo de referencia por concepto; las variantes adicionales se cobran como adicionales.",
  }),
  wmcFixedItem({
    id: "wmc-punta-gondola",
    service: "Punta de góndola",
    amount: 250,
    description:
      "Cabecera de góndola personalizada con iluminación, gráficos y espacio para producto.",
    equivalent: "Proyectos especiales > Diseño de muebles con planos y troqueles desde cero",
    observations:
      "Costo de referencia por concepto; las variantes adicionales se cobran como adicionales.",
  }),
  wmcFixedItem({
    id: "wmc-estacion-prueba-producto",
    service: "Estación para prueba de producto",
    amount: 200,
    description:
      "Carrito móvil con lavamanos funcional, grifo y desagüe para pruebas de producto en piso.",
    equivalent: "Proyectos especiales > Diseño de Stands Creativos para ferias o eventos",
    observations:
      "La complejidad funcional puede requerir una cotización especial fuera del tarifario estándar.",
  }),
  wmcFixedItem({
    id: "wmc-arco-entrada",
    service: "Arco de entrada",
    amount: 200,
    description:
      "Estructura de entrada de tienda a gran formato con iluminación, efecto de niebla y gráficos de marca.",
    equivalent: "Proyectos especiales > Diseño de Stands Creativos para ferias o eventos",
    observations: "La instalación en sitio se cotiza aparte.",
  }),
];

export function formatTariffRange(level?: TariffLevel | null) {
  if (!level) return "";
  return level.reference;
}

export function defaultTariffAmount(level?: TariffLevel | null) {
  if (!level) return "";
  if (typeof level.min === "number" && typeof level.max === "number") {
    return String(level.min === level.max ? level.min : level.min);
  }
  return "";
}
