import { FastifyInstance } from 'fastify';
import { authenticate } from '../hooks/authenticate';
import * as propertyService from '../services/property.service';

export default async function propertyRoutes(fastify: FastifyInstance) {
  fastify.get('/', async () => {
    return propertyService.listProperties();
  });

  fastify.get('/:id', async (request) => {
    const { id } = request.params as any;
    return propertyService.getPropertyById(parseInt(id));
  });

  fastify.post('/', { preHandler: authenticate }, async (request) => {
    return propertyService.createProperty(request.body as any);
  });

  fastify.put('/:id', { preHandler: authenticate }, async (request) => {
    const { id } = request.params as any;
    return propertyService.updateProperty(parseInt(id), request.body as any);
  });

  fastify.delete('/:id', { preHandler: authenticate }, async (request, reply) => {
    const { id } = request.params as any;
    try {
      return await propertyService.deleteProperty(parseInt(id));
    } catch (err: any) {
      return reply.status(err.statusCode || 500).send({ error: err.message || 'Error' });
    }
  });

  fastify.post('/:id/images', { preHandler: authenticate }, async (request, reply) => {
    const { id } = request.params as any;
    const files = request.files();
    return propertyService.uploadPropertyImages(parseInt(id), files);
  });

  fastify.post('/:id/plans', { preHandler: authenticate }, async (request, reply) => {
    const { id } = request.params as any;
    const files = request.files();
    return propertyService.uploadPropertyPlans(parseInt(id), files);
  });

  fastify.delete('/:id/images/:imageId', { preHandler: authenticate }, async (request, reply) => {
    const { imageId } = request.params as any;
    try {
      return await propertyService.deletePropertyImage(parseInt(imageId));
    } catch (err: any) {
      return reply.status(err.statusCode || 500).send({ error: err.message || 'Error' });
    }
  });

  fastify.delete('/:id/plans/:planId', { preHandler: authenticate }, async (request, reply) => {
    const { planId } = request.params as any;
    try {
      return await propertyService.deletePropertyPlan(parseInt(planId));
    } catch (err: any) {
      return reply.status(err.statusCode || 500).send({ error: err.message || 'Error' });
    }
  });
}
