import React from "react";
import { render, fireEvent } from "@testing-library/react-native";
import MissionsDashboard from "../../../src/features/missions/MissionsDashboard";
import type { MobileIntervention } from "../../../src/types/intervention";

const baseProps = {
  interventions: [] as MobileIntervention[],
  loadingInterventions: false,
  interventionsError: null as string | null,
  isOnline: true,
  syncingQueue: false,
  brandColor: "#1E56A8",
  activeTab: "todo" as "todo" | "done",
  onChangeTab: jest.fn(),
  onRefresh: jest.fn(),
  onOpenDetail: jest.fn(),
};

const makeItem = (over: Partial<MobileIntervention> = {}): MobileIntervention => ({
  id: 1,
  titre: "Mission X",
  statut: "planifiee",
  date_prevue: "2026-04-18 10:00:00",
  site_nom: "Site A",
  machine_nom: "M1",
  machine_marque: "Daikin",
  machine_modele: "RX",
  type_intervention: "maintenance_preventive",
  numero_r: "R-001",
  ...over,
});

describe("MissionsDashboard", () => {
  beforeEach(() => {
    baseProps.onChangeTab = jest.fn();
    baseProps.onRefresh = jest.fn();
    baseProps.onOpenDetail = jest.fn();
  });

  it("affiche le badge en ligne quand isOnline=true", () => {
    const { getByText } = render(<MissionsDashboard {...baseProps} />);
    expect(getByText(/Etat reseau: en ligne/)).toBeTruthy();
  });

  it("affiche le badge hors ligne quand isOnline=false", () => {
    const { getByText } = render(<MissionsDashboard {...baseProps} isOnline={false} />);
    expect(getByText(/Etat reseau: hors ligne/)).toBeTruthy();
  });

  it("affiche le texte de sync quand syncingQueue=true", () => {
    const { getByText } = render(<MissionsDashboard {...baseProps} syncingQueue={true} />);
    expect(getByText(/Synchronisation/)).toBeTruthy();
  });

  it("loadingInterventions=true affiche texte Rafraichissement... + loader", () => {
    const { getByText, UNSAFE_getByType } = render(
      <MissionsDashboard {...baseProps} loadingInterventions={true} />
    );
    expect(getByText("Rafraichissement...")).toBeTruthy();
    expect(getByText(/Chargement des interventions/)).toBeTruthy();
    const { ActivityIndicator } = require("react-native");
    expect(UNSAFE_getByType(ActivityIndicator)).toBeTruthy();
  });

  it("Rafraichir appelle onRefresh", () => {
    const onRefresh = jest.fn();
    const { getByText } = render(<MissionsDashboard {...baseProps} onRefresh={onRefresh} />);
    fireEvent.press(getByText("Rafraichir les missions"));
    expect(onRefresh).toHaveBeenCalled();
  });

  it("interventionsError affiche message", () => {
    const { getByText } = render(
      <MissionsDashboard {...baseProps} interventionsError="Err" />
    );
    expect(getByText("Err")).toBeTruthy();
  });

  it("tab actif onglet todo affiche compteur + vide si aucune", () => {
    const { getByText } = render(<MissionsDashboard {...baseProps} />);
    expect(getByText(/À faire \(0\)/)).toBeTruthy();
    expect(getByText(/Aucune mission a faire/)).toBeTruthy();
  });

  it("switchTab : onglet deja actif -> no-op", () => {
    const onChangeTab = jest.fn();
    const onRefresh = jest.fn();
    const { getByText } = render(
      <MissionsDashboard
        {...baseProps}
        onChangeTab={onChangeTab}
        onRefresh={onRefresh}
      />
    );
    fireEvent.press(getByText(/À faire/));
    expect(onChangeTab).not.toHaveBeenCalled();
    expect(onRefresh).not.toHaveBeenCalled();
  });

  it("switchTab : onglet different -> onChangeTab + onRefresh", () => {
    const onChangeTab = jest.fn();
    const onRefresh = jest.fn();
    const { getByText } = render(
      <MissionsDashboard
        {...baseProps}
        onChangeTab={onChangeTab}
        onRefresh={onRefresh}
      />
    );
    fireEvent.press(getByText(/Terminées/));
    expect(onChangeTab).toHaveBeenCalledWith("done");
    expect(onRefresh).toHaveBeenCalled();
  });

  it("filtre todo statuts : vide, planifiee, reportee, en_cours, en_attente", () => {
    const interventions = [
      makeItem({ id: 1, statut: "" }),
      makeItem({ id: 2, statut: "planifiee" }),
      makeItem({ id: 3, statut: "reportee" }),
      makeItem({ id: 4, statut: "en_cours" }),
      makeItem({ id: 5, statut: "en_attente" }),
      makeItem({ id: 6, statut: "terminee" }),
      makeItem({ id: 7, statut: "cloturee" }),
      makeItem({ id: 8, statut: "annulee" }),
    ];
    const { getByText } = render(
      <MissionsDashboard {...baseProps} interventions={interventions} />
    );
    expect(getByText(/À faire \(5\)/)).toBeTruthy();
    expect(getByText(/Terminées \(2\)/)).toBeTruthy();
  });

  it("filtre done statuts : terminee + cloturee affichees en tab done", () => {
    const interventions = [
      makeItem({ id: 6, statut: "terminee", titre: "T1" }),
      makeItem({ id: 7, statut: "cloturee", titre: "T2" }),
    ];
    const { getByText } = render(
      <MissionsDashboard
        {...baseProps}
        interventions={interventions}
        activeTab="done"
      />
    );
    expect(getByText("T1")).toBeTruthy();
    expect(getByText("T2")).toBeTruthy();
  });

  it("done tab vide -> message specifique", () => {
    const { getByText } = render(<MissionsDashboard {...baseProps} activeTab="done" />);
    expect(getByText(/Aucune mission terminee/)).toBeTruthy();
  });

  it("renderIntervention : titre par defaut quand titre absent", () => {
    const interventions = [makeItem({ id: 99, titre: undefined })];
    const { getByText } = render(
      <MissionsDashboard {...baseProps} interventions={interventions} />
    );
    expect(getByText("Intervention #99")).toBeTruthy();
  });

  it("renderIntervention : click 'Voir le detail mission' appelle onOpenDetail", () => {
    const onOpenDetail = jest.fn();
    const interventions = [makeItem({ id: 42 })];
    const { getByText } = render(
      <MissionsDashboard
        {...baseProps}
        interventions={interventions}
        onOpenDetail={onOpenDetail}
      />
    );
    fireEvent.press(getByText("Voir le detail mission"));
    expect(onOpenDetail).toHaveBeenCalledWith(42);
  });

  it("statut null fallback sur - via interventionUtils", () => {
    const interventions = [makeItem({ statut: undefined })];
    const { getByText } = render(
      <MissionsDashboard {...baseProps} interventions={interventions} />
    );
    expect(getByText("Inconnu")).toBeTruthy();
  });
});
