
import React, { useState } from 'react';
import Header from './components/Header';
import Footer from './components/Footer';
import HomePage from './pages/HomePage';
import ServicesPage from './pages/ServicesPage';
import ApplicationPage from './pages/ApplicationPage';
import PricingPage from './pages/PricingPage';
import AboutPage from './pages/AboutPage';
import ContactPage from './pages/ContactPage';
import LegalPage from './pages/LegalPage';
import AdminPage from './pages/AdminPage';
import TrackApplicationPage from './pages/TrackApplicationPage';
import FloatingWhatsApp from './components/FloatingWhatsApp';
import AiChatbot from './components/AiChatbot';
import LoginPage from './pages/LoginPage';
import RegisterPage from './pages/RegisterPage';
import UserDashboardPage from './pages/UserDashboardPage';
import { Page, LegalPageType, Service, Application, User } from './types';
import { INITIAL_SERVICES_DATA } from './constants';

const App: React.FC = () => {
  const [currentPage, setCurrentPage] = useState<Page>('home');
  const [legalPageType, setLegalPageType] = useState<LegalPageType>('disclaimer');
  const [services, setServices] = useState<Service[]>(INITIAL_SERVICES_DATA);
  const [applications, setApplications] = useState<Application[]>([]);
  const [users, setUsers] = useState<User[]>([]);
  const [currentUser, setCurrentUser] = useState<User | null>(null);

  const navigateTo = (page: Page) => {
    if (page === 'userDashboard' && !currentUser) {
      setCurrentPage('userLogin');
    } else {
      setCurrentPage(page);
    }
    window.scrollTo(0, 0);
  };

  const navigateToLegal = (type: LegalPageType) => {
    setLegalPageType(type);
    setCurrentPage('legal');
    window.scrollTo(0, 0);
  }

  const handleRegister = (newUser: Omit<User, 'id'>): boolean => {
    if (users.some(user => user.mobile === newUser.mobile)) {
      return false; // User already exists
    }
    const user: User = { id: `user-${Date.now()}`, ...newUser };
    setUsers(prev => [...prev, user]);
    setCurrentUser(user);
    return true;
  };

  const handleLogin = (mobile: string, password: string): boolean => {
    const user = users.find(u => u.mobile === mobile && u.password === password);
    if (user) {
      setCurrentUser(user);
      return true;
    }
    return false;
  };

  const handleLogout = () => {
    setCurrentUser(null);
    navigateTo('home');
  };

  const addService = (newService: Service) => {
    setServices(prevServices => [...prevServices, newService]);
  };

  const updateService = (updatedService: Service) => {
    setServices(prevServices => 
      prevServices.map(service => 
        service.id === updatedService.id ? updatedService : service
      )
    );
  };

  const deleteService = (serviceId: string) => {
    setServices(prevServices => 
      prevServices.filter(service => service.id !== serviceId)
    );
  };
  
  const addApplication = (newApplication: Application) => {
    setApplications(prevApplications => [newApplication, ...prevApplications]);
  };

  const updateApplicationStatus = (applicationId: string, status: 'Pending' | 'Processing' | 'Completed') => {
    setApplications(prevApplications => 
      prevApplications.map(app => 
        app.id === applicationId ? { ...app, status } : app
      )
    );
  };


  const renderPage = () => {
    switch (currentPage) {
      case 'home':
        return <HomePage navigateTo={navigateTo} services={services} />;
      case 'services':
        return <ServicesPage navigateTo={navigateTo} services={services} />;
      case 'application':
        return <ApplicationPage services={services} addApplication={addApplication} currentUser={currentUser} />;
      case 'track':
        return <TrackApplicationPage applications={applications} services={services} />;
      case 'pricing':
        return <PricingPage navigateTo={navigateTo} services={services} />;
      case 'about':
        return <AboutPage />;
      case 'contact':
        return <ContactPage />;
      case 'legal':
        return <LegalPage type={legalPageType} />;
      case 'adminLogin':
        return <AdminPage 
                  services={services}
                  applications={applications} 
                  addService={addService} 
                  updateService={updateService} 
                  deleteService={deleteService}
                  updateApplicationStatus={updateApplicationStatus} 
                />;
      case 'userLogin':
        return <LoginPage handleLogin={handleLogin} navigateTo={navigateTo} />;
      case 'register':
        return <RegisterPage handleRegister={handleRegister} navigateTo={navigateTo} />;
      case 'userDashboard':
        if (!currentUser) {
          return <LoginPage handleLogin={handleLogin} navigateTo={navigateTo} />;
        }
        const userApplications = applications.filter(app => app.userId === currentUser.id);
        return <UserDashboardPage currentUser={currentUser} applications={userApplications} services={services} navigateTo={navigateTo} />;
      default:
        return <HomePage navigateTo={navigateTo} services={services} />;
    }
  };

  return (
    <div className="bg-gray-50 min-h-screen flex flex-col">
      <Header navigateTo={navigateTo} currentUser={currentUser} handleLogout={handleLogout} />
      <main className="flex-grow">
        {renderPage()}
      </main>
      <Footer navigateToLegal={navigateToLegal} navigateTo={navigateTo} />
      <FloatingWhatsApp />
      <AiChatbot />
    </div>
  );
};

export default App;