import type { ApiResponse, components } from '@alqove/types';
import type { AlqoveClient } from '../client';

/**
 * Team endpoints (Port 00 slices 3–4): memberships, roster, pay rates,
 * positions, invitations. All store-scoped calls are gated server-side by
 * capability; the UI reads the caller's resolved capabilities from
 * `myMemberships()` — never role names — to decide what to render.
 */

export type Membership = components['schemas']['Membership'];
export type StoreMember = components['schemas']['StoreMember'];
export type MembershipUpdateInput = components['schemas']['MembershipUpdateInput'];
export type PayRate = components['schemas']['PayRate'];
export type PayRateInput = components['schemas']['PayRateInput'];
export type Position = components['schemas']['Position'];
export type PositionInput = components['schemas']['PositionInput'];
export type PositionUpdateInput = components['schemas']['PositionUpdateInput'];
export type Invitation = components['schemas']['Invitation'];
export type InvitationInput = components['schemas']['InvitationInput'];
export type StoreRole = components['schemas']['StoreRole'];
export type StoreCapability = components['schemas']['StoreCapability'];

/**
 * Mirrors the API's StoreRole::rank(). Client-side convenience for filtering
 * assignable roles in forms only — the server is authoritative.
 */
export const STORE_ROLE_RANK: Record<StoreRole, number> = {
  owner: 40,
  manager: 30,
  shift_lead: 20,
  sales: 10,
};

export const STORE_ROLE_LABEL: Record<StoreRole, string> = {
  owner: 'Owner',
  manager: 'Manager',
  shift_lead: 'Shift Lead',
  sales: 'Sales',
};

export function createTeamEndpoints(client: AlqoveClient) {
  return {
    /** The caller's own active memberships with resolved capabilities. */
    myMemberships() {
      return client.get<ApiResponse<Membership[]>>('/v1/me/memberships');
    },

    members: {
      list(storeId: string) {
        return client.get<ApiResponse<StoreMember[]>>(`/v1/stores/${storeId}/members`);
      },
      update(storeId: string, membershipId: string, body: MembershipUpdateInput) {
        return client.patch<ApiResponse<StoreMember>>(
          `/v1/stores/${storeId}/members/${membershipId}`,
          body,
        );
      },
      terminate(storeId: string, membershipId: string) {
        return client.delete<void>(`/v1/stores/${storeId}/members/${membershipId}`);
      },
    },

    payRates: {
      list(storeId: string, membershipId: string) {
        return client.get<ApiResponse<PayRate[]>>(
          `/v1/stores/${storeId}/members/${membershipId}/pay-rates`,
        );
      },
      create(storeId: string, membershipId: string, body: PayRateInput) {
        return client.post<ApiResponse<PayRate>>(
          `/v1/stores/${storeId}/members/${membershipId}/pay-rates`,
          body,
        );
      },
    },

    positions: {
      list(storeId: string) {
        return client.get<ApiResponse<Position[]>>(`/v1/stores/${storeId}/positions`);
      },
      create(storeId: string, body: PositionInput) {
        return client.post<ApiResponse<Position>>(`/v1/stores/${storeId}/positions`, body);
      },
      update(storeId: string, positionId: string, body: PositionUpdateInput) {
        return client.patch<ApiResponse<Position>>(
          `/v1/stores/${storeId}/positions/${positionId}`,
          body,
        );
      },
    },

    invitations: {
      list(storeId: string) {
        return client.get<ApiResponse<Invitation[]>>(`/v1/stores/${storeId}/invitations`);
      },
      create(storeId: string, body: InvitationInput) {
        return client.post<ApiResponse<Invitation>>(`/v1/stores/${storeId}/invitations`, body);
      },
      revoke(storeId: string, invitationId: string) {
        return client.delete<void>(`/v1/stores/${storeId}/invitations/${invitationId}`);
      },
      /** Token in the body, never the URL (Port 00 §4). Returns the new membership. */
      accept(token: string) {
        return client.post<ApiResponse<Membership>>('/v1/invitations/accept', { token });
      },
    },
  };
}
