import type {
  ApiResponse,
  CreateStorePayload,
  StoreData,
  StoreSettingsData,
  UpdateStorePayload,
  UpdateStoreSettingsPayload,
  components,
} from '@alqove/types';
import type { AlqoveClient } from '../client';

export type StorePublic = components['schemas']['StorePublic'];

export interface ParcelPreset {
  id: string;
  name: string;
  weight_oz: number;
  length_in: number;
  width_in: number;
  height_in: number;
  is_default: boolean;
}

export function createStoreEndpoints(client: AlqoveClient) {
  return {
    // Public endpoints
    getPublic(storeId: string) {
      return client.get<ApiResponse<StorePublic>>(`/v1/stores/${storeId}`);
    },

    listPublic() {
      return client.get<ApiResponse<StorePublic[]>>('/v1/stores');
    },

    // Seller endpoints (store-scoped)
    get(storeId: string) {
      return client.get<ApiResponse<StoreData>>(`/v1/stores/${storeId}`);
    },

    create(payload: CreateStorePayload) {
      return client.post<ApiResponse<StoreData>>('/v1/stores', payload);
    },

    update(storeId: string, payload: UpdateStorePayload) {
      return client.put<ApiResponse<StoreData>>(`/v1/stores/${storeId}`, payload);
    },

    getSettings(storeId: string) {
      return client.get<ApiResponse<StoreSettingsData>>(`/v1/stores/${storeId}/settings`);
    },

    updateSettings(storeId: string, payload: UpdateStoreSettingsPayload) {
      return client.put<ApiResponse<StoreSettingsData>>(
        `/v1/stores/${storeId}/settings`,
        payload
      );
    },

    parcelPresets: {
      list(storeId: string) {
        return client.get<ApiResponse<ParcelPreset[]>>(
          `/v1/stores/${storeId}/parcel-presets`,
        );
      },
      create(storeId: string, body: Omit<ParcelPreset, 'id'>) {
        return client.post<ApiResponse<ParcelPreset>>(
          `/v1/stores/${storeId}/parcel-presets`,
          body,
        );
      },
      update(
        storeId: string,
        presetId: string,
        body: Partial<Omit<ParcelPreset, 'id'>>,
      ) {
        return client.patch<ApiResponse<ParcelPreset>>(
          `/v1/stores/${storeId}/parcel-presets/${presetId}`,
          body,
        );
      },
      delete(storeId: string, presetId: string) {
        return client.delete<{ message: string }>(
          `/v1/stores/${storeId}/parcel-presets/${presetId}`,
        );
      },
    },
  };
}
