import axiosInstance from '@/utills/axiosInstance';
import { removeEmptyKeys } from '@/utills/helper';
import type { LaunchPayload } from './interface';

export async function getLaunchs(filter: LaunchPayload): Promise<any> {
  try {
    const response = await axiosInstance.get('/api/v1/launch', {
      params: {
        page: filter.page,
        pageSize: filter.pageSize,
        city_id: filter.city_id,
        search: filter?.search,
        sortColumn: filter?.sortColumn,
        sortOrder: filter?.sortOrder,
        location: filter?.location,
        created_by: filter?.created_by,
        status: filter?.status,
        cluster_manager_id: filter?.filters?.cluster_manager_id,
        team_lead_id: filter?.filters?.team_lead_id,
      },
    });

    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to fetch Launchs');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export async function getLeadRequestLaunchs(filter: LaunchPayload): Promise<any> {
  try {
    const response = await axiosInstance.get('/api/v1/launch/launch/only-create-lead-request', {
      params: {
        page: filter.page,
        pageSize: filter.pageSize,
        city_id: filter.city_id,
        search: filter?.search,
        sortColumn: filter?.sortColumn,
        sortOrder: filter?.sortOrder,
        location: filter?.location,
        created_by: filter?.created_by,
        status: filter?.status,
        cluster_manager_id: filter?.filters?.cluster_manager_id,
        team_lead_id: filter?.filters?.team_lead_id,
      },
    });

    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to fetch Launchs');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export async function getLaunchCreatedBy(): Promise<any> {
  try {
    const response = await axiosInstance.get('/api/v1/launch/launch/created-by', {});
    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to fetch Employees');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export async function getProjectCreatedBy(): Promise<any> {
  try {
    const response = await axiosInstance.get('/api/v1/projects/projects/created-by', {});
    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to fetch Employees');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export async function getProjectRegion(): Promise<any> {
  try {
    const response = await axiosInstance.get(
      '/api/v1/projects/projects/created-by?tab_key=region',
      {}
    );
    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to fetch Regions');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export async function getLaunch(id: number, params?: any): Promise<any> {
  const response = await axiosInstance.get(`/api/v1/launch/${id}`, { params });
  return response.data;
}
export async function addLaunch(data: any): Promise<any> {
  try {
    const response = await axiosInstance.post('/api/v1/launch', data);
    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to add Launch');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}
export const updateLaunchData = async(launchId: number, launchData: any): Promise<any> => {
  const response = await axiosInstance.patch(`/api/v1/launch/${launchId}`, launchData);
  if (response.status === 200) {
    return response.data;
  } else {
    throw new Error('Failed to update Launch');
  }
};
export const deleteLaunchData = async(userId: number): Promise<any> => {
  const response = await axiosInstance.delete(`/api/v1/launch/${userId}`);
  if (response.status === 200) {
    return { success: true };
  } else {
    throw new Error('Failed to delete Launch');
  }
};

// Projects API Functions
export async function getProjects(filters: any): Promise<any> {
  const params = removeEmptyKeys({
    page: filters.page,
    pageSize: filters.pageSize,
    city_id: filters.city_id,
    locality_name: filters.locality_name,
    search: filters.search,
    location: filters.location,
    sortColumn: filters.sortColumn,
    sortOrder: filters.sortOrder,
    created_by: filters.created_by,
    region_id: filters.region_id,
    builder_id: filters.builder_id,
    status: filters.status,
    notassigned: filters.notassigned,
  });
  try {
    const response = await axiosInstance.get('/api/v1/projects', {
      params: params,
    });
    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to fetch projects');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export async function getProject(id: any): Promise<any> {
  const response = await axiosInstance.get(`/api/v1/projects/${id}`);
  return response.data;
}
export async function getLaunchProjects(id: any, params?: any): Promise<any> {
  const response = await axiosInstance.get(`/api/v1/launch/project-by-launch-id/${id}`, { params });
  return response.data;
}

export async function getLeadRequestsByLaunch(id: number | string): Promise<any> {
  const response = await axiosInstance.get(`/api/v1/lead-requests/by-launch/${id}`);
  return response.data;
}

export async function addProject(data: any): Promise<any> {
  try {
    const response = await axiosInstance.post('/api/v1/projects', data);
    if (response.status === 200) {
      return response.data;
    } else {
      console.error('error');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export const updateProjectData = async(id: any, data: any): Promise<any> => {
  const queryString = removeEmptyKeys(data);
  const response = await axiosInstance.patch(`/api/v1/projects/${id}`, queryString);
  if (response.status === 200) {
    return response.data;
  } else {
    throw new Error('Failed to update project');
  }
};

export const deleteProjectData = async(projectId: number): Promise<any> => {
  const response = await axiosInstance.delete(`/api/v1/projects/${projectId}`);
  if (response.status === 200) {
    return { success: true };
  } else {
    throw new Error('Failed to delete project');
  }
};

/*
Switch services
*/
export async function addSwitch(data: any): Promise<any> {
  try {
    const response = await axiosInstance.post('/api/v1/launch/change-status/by-launch', data);
    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to add Switch');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}
export const updateSwitch = async(launchID: number, launchData: any): Promise<any> => {
  try {
    const response = await axiosInstance.patch(
      `/api/v1/launch/change-status/by-launch/${launchID}`,
      launchData
    );
    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to update Switch');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
};

export async function getFacebookData(filter: any): Promise<any> {
  try {
    const response = await axiosInstance.get('/api/v1/projects/facebook/form-list', {
      params: {
        page: filter.page,
        pageSize: filter.pageSize,
        project_id: filter.projectID,
      },
    });
    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to fetch Launchs');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export async function getProjectChannel(id: number): Promise<any> {
  const response = await axiosInstance.get(`/api/v1/projects/channel/${id}`);
  return response.data;
}

export async function addProjectChannel(id: number, data: any): Promise<any> {
  try {
    const response = await axiosInstance.post(`/api/v1/projects/channel/${id}`, data);
    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to add Marketing Channel');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export const updateProjectMarketingChannel = async(
  channelId: number,
  channelData: any
): Promise<any> => {
  try {
    const response = await axiosInstance.patch(
      `/api/v1/projects/channel/${channelId}`,
      channelData
    );
    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to update Marketing Channel');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
};

export async function addLaunchSales(data: any): Promise<any> {
  try {
    const response = await axiosInstance.post('/api/v1/launch/create-sales/by-launch', data);
    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to add Launch Sales');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export const updateLaunchSales = async(id: number, data: any): Promise<any> => {
  try {
    const response = await axiosInstance.patch(
      `/api/v1/launch/update-sales/by-launch/${id}`,
      data
    );
    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to update Launch Sales');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
};

export const deleteLaunchSales = async(id: number): Promise<any> => {
  const response = await axiosInstance.delete(`/api/v1/launch/delete-sales/by-launch/${id}`);
  if (response.status === 200) {
    return response;
  } else {
    throw new Error('Failed to delete Launch Sales');
  }
};

export async function getProjectsBasedOnUser(): Promise<any> {
  const response = await axiosInstance.get('/api/v1/projects/projects/project-list');
  return response.data;
}

export async function getProjectsConfiguration(id: string): Promise<any> {
  const response = await axiosInstance.get(
    `/api/v1/projects/projects/configuration?project_id=${id}`
  );
  return response.data;
}

export const updateLaunchLead = async(launchId: number, launchData: any): Promise<any> => {
  const response = await axiosInstance.patch(`/api/v1/launch/update-sales-all/by-launch/${launchId}`, launchData);
  if (response.status === 200) {
    return response.data;
  } else {
    throw new Error('Failed to update Launch');
  }
};
