import axios from "axios";
import type { ApiResponse } from "~/types/ApiResponse";

export const useApi = <T>(table: string) => {
  
      const data = ref(null);
      const error = ref(null);
      const loading = ref(false);
      const pagination = reactive({
        total: 0,
        current_page: 1,
        last_page: 1
      });

    const fetchAll = async (page = 1, perPage = 20, payload = null) => {
        
        loading.value = true;

        try{

          const response = await $fetch(`/api/${table}?page=${page}&per_page=${perPage}&${payload}`, {
            method: 'GET',
            headers: {
              Authorization: `Bearer ${localStorage.getItem('token')}`,
              'route_id': `${localStorage.getItem('selected_route_id')}`
            }
          });

          data.value = response.data;

          if(response.pagination?.total > 0){
            pagination.total = response.pagination.total;
            pagination.current_page = response.pagination.current_page;
            pagination.last_page = response.pagination.last_page;
          }

          loading.value = false;

        }catch(err: any){
          loading.value = false;
          error.value = err;
        }

        finally{
          loading.value = false;
        }
        
    }
  

    const create = async (payload: any) => {
      try {
        return await $fetch(`/api/${table}`, {
          method: 'POST',
          body: payload,
          headers: {
            Authorization: `Bearer ${localStorage.getItem('token')}`,
            'route_id': `${localStorage.getItem('selected_route_id')}`
          }
        })
      } catch (error) {
        console.error(`Error creating record in ${table}:`, error)
        return null
      }
    }


  
    const update = async (payload: any, id: number) => {
      try {
        return await $fetch(`/api/${table}/${id}`, {
          method: 'PUT',
          body: payload,
          headers: {
            Authorization: `Bearer ${localStorage.getItem('token')}`,
            'route_id': `${localStorage.getItem('selected_route_id')}`
          }
        })
      } catch (error) {
        console.error(`Error creating record in ${table}:`, error)
        return null
      }
    }


  
    const remove = async (id: number) => {
      try {
        return await $fetch(`/api/${table}/${id}`, {
          method: 'DELETE',
          headers: {
            Authorization: `Bearer ${localStorage.getItem('token')}`,
            'route_id': `${localStorage.getItem('selected_route_id')}`
          }
        })
      } catch (error) {
        console.error(`Error creating record in ${table}:`, error)
        return null
      }
    }



    const download = async (payload: any) => {
      try {


        // return await $fetch(`/api/${table}`, {
        //   method: 'POST',
        //   body: payload,
        //   headers: {
        //     Authorization: `Bearer ${localStorage.getItem('token')}`,
        //     'route_id': `${localStorage.getItem('selected_route_id')}`,
        //     'download': 'yes'
        //   },
        //   responseType: 'blob'
        // })

        return await axios.post(`/api/${table}`, payload,{
          headers: {
            Authorization: `Bearer ${localStorage.getItem('token')}`,
            'route_id': `${localStorage.getItem('selected_route_id')}`,
            Accept: 'application/pdf',
            'download': 'yes'
          },
          responseType: 'blob'
        })

      } catch (error) {
        console.error(`Error creating record in ${table}:`, error)
        return null
      }
    }


    const fetchSingleData = async (id: number,lang = "") => {
        
      loading.value = true;

      try{

        console.log("url here......");
        console.log(`/api/${table}/${id}?lang=${lang}`);

        const response = await $fetch(`/api/${table}/${id}?lang=${lang}`, {
          method: 'GET',
          headers: {
            Authorization: `Bearer ${localStorage.getItem('token')}`,
            'route_id': `${localStorage.getItem('selected_route_id')}`
          }
        });

        data.value = response.data;
        console.log("loaded server data ");
        console.log(response.data);

      }catch(err: any){
        error.value = err;
      }

      finally{
        loading.value = false;
      }
      
    }


  const memo = async (payload: string) => {
        
      loading.value = true;

      try{

        const response = await $fetch(`/api/${table}?${payload}`, {
          method: 'GET',
          headers: {
            Authorization: `Bearer ${localStorage.getItem('token')}`
          }
        });

        data.value = response.data;
        console.log("loaded server data ");
        console.log(response.data);

      }catch(err: any){
        error.value = err;
      }

      finally{
        loading.value = false;
      }
      
  }
  
    return { data, error, loading, fetchAll, create, update, remove, pagination, download, fetchSingleData, memo }
}