import { z } from 'zod';
import { insertGuestSchema } from './schema';

export const errorSchemas = {
  validation: z.object({
    message: z.string(),
    field: z.string().optional(),
  }),
  notFound: z.object({
    message: z.string(),
  }),
  internal: z.object({
    message: z.string(),
  }),
};

export const api = {
  auth: {
    login: {
      method: 'POST' as const,
      path: '/api/auth/login' as const,
    },
    logout: {
      method: 'POST' as const,
      path: '/api/auth/logout' as const,
    },
    me: {
      method: 'GET' as const,
      path: '/api/auth/me' as const,
    },
    recoverCode: {
      method: 'POST' as const,
      path: '/api/auth/recover' as const,
    },
  },
  guests: {
    list: {
      method: 'GET' as const,
      path: '/api/guests' as const,
      responses: {
        200: z.array(z.any()),
      },
    },
    get: {
      method: 'GET' as const,
      path: '/api/guests/:id' as const,
      responses: {
        200: z.any(),
        404: errorSchemas.notFound,
      },
    },
    create: {
      method: 'POST' as const,
      path: '/api/guests' as const,
      input: insertGuestSchema.omit({ userId: true }),
      responses: {
        201: z.any(),
        400: errorSchemas.validation,
      },
    },
    update: {
      method: 'PUT' as const,
      path: '/api/guests/:id' as const,
      input: insertGuestSchema.omit({ userId: true }).partial(),
      responses: {
        200: z.any(),
        400: errorSchemas.validation,
        404: errorSchemas.notFound,
      },
    },
    delete: {
      method: 'DELETE' as const,
      path: '/api/guests/:id' as const,
      responses: {
        204: z.void(),
        404: errorSchemas.notFound,
      },
    },
    sendInvite: {
      method: 'POST' as const,
      path: '/api/guests/:id/send' as const,
      responses: {
        200: z.object({ success: z.boolean(), message: z.string() }),
        404: errorSchemas.notFound,
        500: errorSchemas.internal,
      },
    },
  },
  media: {
    upload: {
      method: 'POST' as const,
      path: '/api/media/upload' as const,
      responses: {
        200: z.object({ url: z.string(), type: z.enum(['image', 'video']), autoResumed: z.boolean().optional(), resumedCount: z.number().optional(), resumeSpreadHours: z.number().optional() }),
        400: errorSchemas.validation,
      },
    },
    getGlobal: {
      method: 'GET' as const,
      path: '/api/media/global' as const,
      responses: {
        200: z.object({ url: z.string().nullable(), type: z.enum(['image', 'video']).nullable() }),
      },
    },
  },
  whatsapp: {
    status: {
      method: 'GET' as const,
      path: '/api/whatsapp/status' as const,
      responses: {
        200: z.object({ 
          status: z.enum(['connected', 'disconnected', 'connecting', 'qr_ready']),
          qr: z.string().optional()
        }),
      },
    },
  },
};

export function buildUrl(path: string, params?: Record<string, string | number>): string {
  let url = path;
  if (params) {
    Object.entries(params).forEach(([key, value]) => {
      if (url.includes(`:${key}`)) {
        url = url.replace(`:${key}`, String(value));
      }
    });
  }
  return url;
}

export type GuestInput = z.infer<typeof api.guests.create.input>;
export type GuestResponse = z.infer<typeof api.guests.create.responses[201]>;
