import type { PlanningProjectState } from "@/types/commerce";
import type { PlanningAiInsights } from "@/utils/planningEstimator";
import { API_BASE_URL } from "@/utils/constants";

export interface SavePlanningPayload {
  tipo_aplicativo: string;
  tipo_projeto: string;
  objetivo_projeto: string;
  funcionalidades: string[];
  plataformas: string[];
  servicos_opcionais: string[];
  estilo_visual: string;
  referencias: { links: string[]; files: string[] };
  plano: string;
  valor_planejamento: number;
  prazo_estimado: string;
  complexidade: string;
  status_pagamento: string;
  status_projeto: string;
  ai_insights?: PlanningAiInsights | null;
}

function buildPayload(
  planning: PlanningProjectState,
  extras: { prazo: string; statusPagamento: string; statusProjeto: string; valor: number },
): SavePlanningPayload {
  return {
    tipo_aplicativo: planning.projectType,
    tipo_projeto: planning.projectType,
    objetivo_projeto: planning.projectObjective,
    funcionalidades: planning.featureIds,
    plataformas: planning.platformIds,
    servicos_opcionais: planning.optionalServiceIds,
    estilo_visual: planning.visualStyle,
    referencias: {
      links: planning.referenceLinks,
      files: planning.referenceFileNames,
    },
    plano: planning.planningPlanSlug,
    valor_planejamento: extras.valor,
    prazo_estimado: extras.prazo,
    complexidade: planning.aiInsights?.complexity ?? "Média",
    status_pagamento: extras.statusPagamento,
    status_projeto: extras.statusProjeto,
    ai_insights: planning.aiInsights,
  };
}

export const planningService = {
  async save(
    token: string,
    planning: PlanningProjectState,
    options?: {
      statusPagamento?: string;
      statusProjeto?: string;
      prazo?: string;
      valor?: number;
    },
  ) {
    const { estimatePlanningTimeline } = await import("@/utils/planningEstimator");
    const { findPlanningPlanView } = await import("@/lib/planningPlans");
    const valor =
      options?.valor ??
      findPlanningPlanView(planning.planningPlanSlug, null)?.price ??
      0;
    const payload = buildPayload(planning, {
      prazo:
        options?.prazo ??
        estimatePlanningTimeline(planning.planningPlanSlug, null),
      statusPagamento: options?.statusPagamento ?? "pending",
      statusProjeto: options?.statusProjeto ?? "planning",
      valor,
    });

    const res = await fetch(`${API_BASE_URL}/client/planning-quotes`, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        Accept: "application/json",
        Authorization: `Bearer ${token}`,
      },
      body: JSON.stringify(payload),
    });

    if (!res.ok) {
      const err = await res.json().catch(() => ({}));
      throw new Error(
        (err as { message?: string }).message ?? "Não foi possível salvar o planejamento.",
      );
    }
    return res.json();
  },
};
