import { Navigate, Route, Routes, useLocation } from "react-router-dom";
import { MainLayout } from "@/modules/fechamento-hgtx/components/layout/MainLayout";
import Fechamentos from "@/modules/fechamento-hgtx/pages/Fechamentos";
import CompetenciaFechamentos from "@/modules/fechamento-hgtx/pages/CompetenciaFechamentos";
import FechamentoDetalhes from "@/modules/fechamento-hgtx/pages/FechamentoDetalhes";
import BancoPontos from "@/modules/fechamento-hgtx/pages/BancoPontos";
import BancoPontosExtrato from "@/modules/fechamento-hgtx/pages/BancoPontosExtrato";
import Parceiros from "@/modules/fechamento-hgtx/pages/Parceiros";
import Usuarios from "@/modules/fechamento-hgtx/pages/Usuarios";
import Configuracoes from "@/modules/fechamento-hgtx/pages/Configuracoes";
import MeuPerfil from "@/modules/fechamento-hgtx/pages/MeuPerfil";
import MeuFechamento from "@/modules/fechamento-hgtx/pages/MeuFechamento";
import MeuFechamentoBancoPontos from "@/modules/fechamento-hgtx/pages/MeuFechamentoBancoPontos";
import NotFound from "@/modules/fechamento-hgtx/pages/NotFound";
import { AuthAccessProvider, useAuthAccess } from "@/contexts/AuthAccessContext";
import { AuthGate } from "@/components/auth/AuthGate";
import { UnidadeGate } from "@/components/fechamento/UnidadeGate";

function RequireAdminRoute({ children }: { children: JSX.Element }) {
  const { papel } = useAuthAccess();

  if (papel === "admin") {
    return children;
  }

  return <Navigate to="/fechamento/meu-fechamento" replace />;
}

function RequireFechamentoDetalheRoute({ children }: { children: JSX.Element }) {
  const { papel } = useAuthAccess();
  const location = useLocation();
  const readonlyView = Boolean((location.state as { readonlyView?: boolean } | null)?.readonlyView);

  if (papel === "admin") {
    return children;
  }

  if (papel === "parceiro" && readonlyView) {
    return children;
  }

  return <Navigate to="/fechamento/meu-fechamento" replace />;
}

const FechamentoHgtxApp = () => {
  return (
    <AuthAccessProvider>
      <AuthGate>
        <UnidadeGate>
          <MainLayout>
          <Routes>
            <Route
              index
              element={
                <RequireAdminRoute>
                  <Fechamentos />
                </RequireAdminRoute>
              }
            />
            <Route
              path="competencias/:id"
              element={
                <RequireAdminRoute>
                  <CompetenciaFechamentos />
                </RequireAdminRoute>
              }
            />
            <Route
              path="fechamentos/:id"
              element={
                <RequireFechamentoDetalheRoute>
                  <FechamentoDetalhes />
                </RequireFechamentoDetalheRoute>
              }
            />
            <Route
              path="banco-pontos"
              element={
                <RequireAdminRoute>
                  <BancoPontos />
                </RequireAdminRoute>
              }
            />
            <Route
              path="banco-pontos/:parceiroId"
              element={
                <RequireAdminRoute>
                  <BancoPontosExtrato />
                </RequireAdminRoute>
              }
            />
            <Route path="meu-perfil" element={<MeuPerfil />} />
            <Route path="meu-fechamento" element={<MeuFechamento />} />
            <Route path="meu-fechamento/banco-pontos" element={<MeuFechamentoBancoPontos />} />
            <Route
              path="parceiros"
              element={
                <RequireAdminRoute>
                  <Parceiros />
                </RequireAdminRoute>
              }
            />
            <Route
              path="usuarios"
              element={
                <RequireAdminRoute>
                  <Usuarios />
                </RequireAdminRoute>
              }
            />
            <Route
              path="configuracoes"
              element={
                <RequireAdminRoute>
                  <Configuracoes />
                </RequireAdminRoute>
              }
            />
            <Route path="*" element={<NotFound />} />
          </Routes>
          </MainLayout>
        </UnidadeGate>
      </AuthGate>
    </AuthAccessProvider>
  );
};

export default FechamentoHgtxApp;
