
import { useState, useEffect } from 'react';
import { supabase } from '@/integrations/supabase/client';
import { toast } from 'sonner';
import { useAuth } from './useAuth';
import { CronogramaOf } from '@/types/cronograma';

export const useCronogramaOperations = () => {
  const { user } = useAuth();
  const [cronogramas, setCronogramas] = useState<CronogramaOf[]>([]);
  const [loading, setLoading] = useState(false);

  const loadCronogramas = async () => {
    try {
      setLoading(true);
      
      const { data: cronogramasData, error: cronogramasError } = await supabase
        .from('cronogramas_of')
        .select(`
          *,
          ordens_fabricacao (
            num_of,
            descritivo
          ),
          profiles!cronogramas_of_gestor_id_fkey (
            full_name,
            email
          )
        `)
        .order('created_at', { ascending: false });

      if (cronogramasError) throw cronogramasError;

      // Carregar processos para cada cronograma
      const cronogramasComProcessos = await Promise.all(
        (cronogramasData || []).map(async (cronograma) => {
          const { data: processos, error: processosError } = await supabase
            .from('processos_cronograma')
            .select('*')
            .eq('cronograma_id', cronograma.id)
            .order('ordem');

          if (processosError) throw processosError;

          return {
            id: cronograma.id,
            of_id: cronograma.of_id,
            gestor_id: cronograma.gestor_id,
            revisao: cronograma.revisao,
            processos: processos || [],
            ordem_fabricacao: cronograma.ordens_fabricacao,
            gestor_profile: cronograma.profiles
          } as CronogramaOf;
        })
      );

      setCronogramas(cronogramasComProcessos);
    } catch (error) {
      console.error('Erro ao carregar cronogramas:', error);
      toast.error('Erro ao carregar cronogramas');
    } finally {
      setLoading(false);
    }
  };

  const saveCronograma = async (cronograma: Partial<CronogramaOf> & { processos: any[] }) => {
    try {
      if (!user) throw new Error('Usuário não autenticado');

      let cronogramaId: string;

      if (cronograma.id) {
        // Atualizar cronograma existente
        const novaRevisao = cronograma.revisao ? cronograma.revisao + 1 : 1;
        
        const { data: updatedCronograma, error: updateError } = await supabase
          .from('cronogramas_of')
          .update({
            gestor_id: cronograma.gestor_id,
            revisao: novaRevisao,
            updated_at: new Date().toISOString()
          })
          .eq('id', cronograma.id)
          .select()
          .single();

        if (updateError) throw updateError;
        cronogramaId = updatedCronograma.id;

        // Deletar processos antigos
        const { error: deleteError } = await supabase
          .from('processos_cronograma')
          .delete()
          .eq('cronograma_id', cronogramaId);

        if (deleteError) throw deleteError;
      } else {
        // Verificar se já existe cronograma para esta OF
        const { data: existingCronograma } = await supabase
          .from('cronogramas_of')
          .select('id, revisao')
          .eq('of_id', cronograma.of_id)
          .single();

        if (existingCronograma) {
          // Atualizar cronograma existente
          const novaRevisao = existingCronograma.revisao + 1;
          
          const { data: updatedCronograma, error: updateError } = await supabase
            .from('cronogramas_of')
            .update({
              gestor_id: cronograma.gestor_id,
              revisao: novaRevisao,
              updated_at: new Date().toISOString()
            })
            .eq('id', existingCronograma.id)
            .select()
            .single();

          if (updateError) throw updateError;
          cronogramaId = updatedCronograma.id;

          // Deletar processos antigos
          const { error: deleteError } = await supabase
            .from('processos_cronograma')
            .delete()
            .eq('cronograma_id', cronogramaId);

          if (deleteError) throw deleteError;
        } else {
          // Criar novo cronograma
          const { data: newCronograma, error: insertError } = await supabase
            .from('cronogramas_of')
            .insert({
              of_id: cronograma.of_id,
              gestor_id: cronograma.gestor_id,
              revisao: 1,
              created_by: user.id
            })
            .select()
            .single();

          if (insertError) throw insertError;
          cronogramaId = newCronograma.id;
        }
      }

      // Inserir novos processos
      const processosParaInserir = cronograma.processos.map(processo => ({
        cronograma_id: cronogramaId,
        nome_processo: processo.nome_processo,
        data_inicio: processo.data_inicio,
        data_fim: processo.data_fim,
        ordem: processo.ordem
      }));

      const { error: processosError } = await supabase
        .from('processos_cronograma')
        .insert(processosParaInserir);

      if (processosError) throw processosError;

      toast.success('Cronograma salvo com sucesso!');
      loadCronogramas();
      return true;
    } catch (error) {
      console.error('Erro ao salvar cronograma:', error);
      toast.error('Erro ao salvar cronograma');
      return false;
    }
  };

  const deleteCronograma = async (cronogramaId: string) => {
    try {
      const { error } = await supabase
        .from('cronogramas_of')
        .delete()
        .eq('id', cronogramaId);

      if (error) throw error;

      toast.success('Cronograma removido com sucesso!');
      loadCronogramas();
      return true;
    } catch (error) {
      console.error('Erro ao deletar cronograma:', error);
      toast.error('Erro ao remover cronograma');
      return false;
    }
  };

  const getCronogramaPorOf = async (ofId: string) => {
    try {
      const { data: cronograma, error } = await supabase
        .from('cronogramas_of')
        .select(`
          *,
          ordens_fabricacao (
            num_of,
            descritivo
          ),
          profiles!cronogramas_of_gestor_id_fkey (
            full_name,
            email
          )
        `)
        .eq('of_id', ofId)
        .single();

      if (error && error.code !== 'PGRST116') throw error;

      if (!cronograma) return null;

      const { data: processos, error: processosError } = await supabase
        .from('processos_cronograma')
        .select('*')
        .eq('cronograma_id', cronograma.id)
        .order('ordem');

      if (processosError) throw processosError;

      return {
        id: cronograma.id,
        of_id: cronograma.of_id,
        gestor_id: cronograma.gestor_id,
        revisao: cronograma.revisao,
        processos: processos || [],
        ordem_fabricacao: cronograma.ordens_fabricacao,
        gestor_profile: cronograma.profiles
      } as CronogramaOf;
    } catch (error) {
      console.error('Erro ao buscar cronograma:', error);
      return null;
    }
  };

  useEffect(() => {
    loadCronogramas();
  }, []);

  return {
    cronogramas,
    loading,
    loadCronogramas,
    saveCronograma,
    deleteCronograma,
    getCronogramaPorOf
  };
};
