import { supabase } from '@/integrations/supabase/client';
import type { Json } from '@/integrations/supabase/types';
import { uploadPendingImages } from './imageUploadHelper';
import { CompanyFormData, TempCompanyData } from '@/types/company';
import { logger } from './logger';
import { getErrorMessage } from './errorHandler';

export type { CompanyFormData, TempCompanyData };

export async function submitCompanyCreation(
  data: CompanyFormData, 
  companyType: 'manufacturer' | 'designer' | 'operator' | 'property_owner',
  userId: string
) {
  // Check if user is banned
  const { data: profile } = await supabase
    .from('profiles')
    .select('banned')
    .eq('user_id', userId)
    .single();

  if (profile?.banned) {
    throw new Error('Account suspended. Contact support for assistance.');
  }

  // Upload any pending local images first
  let processedImages = data.images;
  if (data.images?.uploaded && data.images.uploaded.length > 0) {
    try {
      const uploadedImages = await uploadPendingImages(data.images.uploaded);
      processedImages = {
        ...data.images,
        uploaded: uploadedImages
      };
    } catch (error: unknown) {
      const errorMsg = getErrorMessage(error);
      logger.error('Failed to upload images for company', {
        action: `${companyType}_creation`,
        error: errorMsg
      });
      throw new Error('Failed to upload images. Please check your connection and try again.');
    }
  }

  // Create the main submission record
  const { data: submissionData, error: submissionError } = await supabase
    .from('content_submissions')
    .insert({
      user_id: userId,
      submission_type: companyType,
      content: {
        action: 'create'
      },
      status: 'pending' as const
    })
    .select('id')
    .single();

  if (submissionError) throw submissionError;

  // Create the submission item with actual company data
  const { error: itemError } = await supabase
    .from('submission_items')
    .insert({
      submission_id: submissionData.id,
      item_type: companyType,
      item_data: {
        name: data.name,
        slug: data.slug,
        description: data.description,
        person_type: data.person_type,
        website_url: data.website_url,
        founded_year: data.founded_year,
        headquarters_location: data.headquarters_location,
        company_type: companyType,
        images: processedImages as unknown as Json
      },
      status: 'pending' as const,
      order_index: 0
    });

  if (itemError) throw itemError;

  return { submitted: true, submissionId: submissionData.id };
}

export async function submitCompanyUpdate(
  companyId: string,
  data: CompanyFormData,
  userId: string
) {
  // Check if user is banned
  const { data: profile } = await supabase
    .from('profiles')
    .select('banned')
    .eq('user_id', userId)
    .single();

  if (profile?.banned) {
    throw new Error('Account suspended. Contact support for assistance.');
  }

  // Fetch existing company data (all fields for original_data)
  const { data: existingCompany, error: fetchError } = await supabase
    .from('companies')
    .select('id, name, slug, description, company_type, person_type, logo_url, card_image_url, banner_image_url, banner_image_id, card_image_id, headquarters_location, website_url, founded_year, founded_date, founded_date_precision')
    .eq('id', companyId)
    .single();

  if (fetchError) throw fetchError;
  if (!existingCompany) throw new Error('Company not found');

  // Upload any pending local images first
  let processedImages = data.images;
  if (data.images?.uploaded && data.images.uploaded.length > 0) {
    try {
      const uploadedImages = await uploadPendingImages(data.images.uploaded);
      processedImages = {
        ...data.images,
        uploaded: uploadedImages
      };
    } catch (error: unknown) {
      const errorMsg = getErrorMessage(error);
      logger.error('Failed to upload images for company update', {
        action: `${existingCompany.company_type}_update`,
        companyId,
        error: errorMsg
      });
      throw new Error('Failed to upload images. Please check your connection and try again.');
    }
  }

  // Create the main submission record
  const { data: submissionData, error: submissionError } = await supabase
    .from('content_submissions')
    .insert({
      user_id: userId,
      submission_type: existingCompany.company_type,
      content: {
        action: 'edit',
        company_id: companyId
      },
      status: 'pending' as const
    })
    .select('id')
    .single();

  if (submissionError) throw submissionError;

  // Create the submission item with actual company data AND original data
  const { error: itemError } = await supabase
    .from('submission_items')
    .insert({
      submission_id: submissionData.id,
      item_type: existingCompany.company_type,
      item_data: {
        company_id: companyId,
        name: data.name,
        slug: data.slug,
        description: data.description,
        person_type: data.person_type,
        website_url: data.website_url,
        founded_year: data.founded_year,
        headquarters_location: data.headquarters_location,
        images: processedImages as unknown as Json
      },
      original_data: JSON.parse(JSON.stringify(existingCompany)),
      status: 'pending' as const,
      order_index: 0
    });

  if (itemError) throw itemError;

  return { submitted: true, submissionId: submissionData.id };
}
