'use client';

import { createContext, useContext, useState, ReactNode } from 'react';

/* =========================================================
   TYPES
   ========================================================= */

export interface EditorJson {
  type: string;
  content?: any[];
}

export interface JobDraft {
  // Type d'offre
  offerType: 'standard' | 'premium';

  // Informations générales
  title: string;
  company: string;
  contractType: string;

  // Localisation
  location: {
    city: string;
    postalCode: string;
    department: string;
    remote: boolean | 'none' | 'partial' | 'full';
  };

  // Rémunération
  salaryMin: number;
  salaryMax: number;
  salaryUnit: 'monthly' | 'annual';

  // Contenu riche
  description: EditorJson | null;
  missions: EditorJson | null;
  candidateProfile: EditorJson | null;

  // Listes
  skills: string[];
  softSkills: string[];
  benefits: string[];
  seniorAdaptations: string[];
  constraints: string[];
}

/* =========================================================
   VALEUR PAR DÉFAUT (IMMUTABLE)
   ========================================================= */

export const defaultJob: JobDraft = {
  offerType: 'standard',
  title: '',
  company: '',
  contractType: 'CDI',
  location: {
    city: '',
    postalCode: '',
    department: '',
    remote: 'none',
  },
  salaryMin: 0,
  salaryMax: 0,
  salaryUnit: 'annual',
  description: null,
  missions: null,
  candidateProfile: null,
  skills: [],
  softSkills: [],
  benefits: [],
  seniorAdaptations: [],
  constraints: [],
};

/* =========================================================
   CONTEXT
   ========================================================= */

interface JobDraftContextType {
  job: JobDraft;
  setJob: (job: JobDraft) => void;
  updateJob: (updates: Partial<JobDraft>) => void;
  resetJob: () => void;
  legalMinSalary: number;
  isSalaryCompliant: boolean;
}

const JobDraftContext = createContext<JobDraftContextType | null>(null);

/* =========================================================
   PROVIDER
   ========================================================= */

export function JobDraftProvider({ children }: { children: ReactNode }) {
  const [job, setJob] = useState<JobDraft>(defaultJob);

  // SMIC annuel brut (base 35h)
  const legalMinSalary = 20815;

  const isSalaryCompliant =
    job.salaryUnit === 'annual'
      ? job.salaryMin >= legalMinSalary
      : job.salaryMin * 12 >= legalMinSalary;

  const updateJob = (updates: Partial<JobDraft>) => {
    setJob(prev => ({ ...prev, ...updates }));
  };

  const resetJob = () => {
    setJob(defaultJob);
  };

  const value: JobDraftContextType = {
    job,
    setJob,
    updateJob,
    resetJob,
    legalMinSalary,
    isSalaryCompliant,
  };

  return (
    <JobDraftContext.Provider value={value}>
      {children}
    </JobDraftContext.Provider>
  );
}

/* =========================================================
   HOOK SAFE (RÈGLE D’OR NEXT.JS)
   ========================================================= */

export function useJobDraft(): JobDraftContextType {
  const context = useContext(JobDraftContext);

  /**
   * ⚠️ RÈGLE D’OR :
   * Ne JAMAIS throw dans un hook client App Router.
   * En rendu concurrent / hydration, cela provoque un écran blanc.
   */
  if (!context) {
    return {
      job: defaultJob,
      setJob: () => {},
      updateJob: () => {},
      resetJob: () => {},
      legalMinSalary: 20815,
      isSalaryCompliant: true,
    };
  }

  return context;
}
