import swaggerJsdoc from 'swagger-jsdoc'
import swaggerUi from 'swagger-ui-express'
import type { Application } from '@adonisjs/core/app'

const options = {
    definition: {
        openapi: '3.0.0',
        info: {
            title: 'SIGIA API',
            version: '1.0.0',
            description: 'Sistema Integrado de Gestão e Informação Agrícola - API Documentation',
            contact: {
                name: 'SIGIA Team',
                email: 'support@sigia.com',
            },
        },
        servers: [
            {
                url: 'http://localhost:3333',
                description: 'Development server',
            },
        ],
        components: {
            securitySchemes: {
                bearerAuth: {
                    type: 'http',
                    scheme: 'bearer',
                    bearerFormat: 'JWT',
                },
            },
            schemas: {
                User: {
                    type: 'object',
                    properties: {
                        id: { type: 'integer' },
                        fullName: { type: 'string' },
                        email: { type: 'string', format: 'email' },
                        createdAt: { type: 'string', format: 'date-time' },
                    },
                },
                Cliente: {
                    type: 'object',
                    properties: {
                        id: { type: 'integer' },
                        nome: { type: 'string' },
                        email: { type: 'string', format: 'email' },
                        telefone: { type: 'string' },
                        nif: { type: 'string' },
                        endereco: { type: 'string' },
                        isAtivo: { type: 'boolean' },
                    },
                },
                Produto: {
                    type: 'object',
                    properties: {
                        id: { type: 'integer' },
                        codigoPsu: { type: 'string' },
                        artigo: { type: 'string' },
                        nome: { type: 'string' },
                        descricao: { type: 'string' },
                        valor: { type: 'number' },
                        moeda: { type: 'string' },
                        marca: { type: 'string' },
                        categoria: { type: 'string' },
                        estoque: { type: 'integer' },
                    },
                },
                Proforma: {
                    type: 'object',
                    properties: {
                        id: { type: 'integer' },
                        numero: { type: 'string' },
                        clienteId: { type: 'integer' },
                        dataEmissao: { type: 'string', format: 'date' },
                        dataValidade: { type: 'string', format: 'date' },
                        subtotal: { type: 'number' },
                        descontoPercentual: { type: 'number' },
                        descontoValor: { type: 'number' },
                        total: { type: 'number' },
                        status: { type: 'string', enum: ['pendente', 'aprovada', 'rejeitada', 'convertida'] },
                        observacoes: { type: 'string' },
                    },
                },
                Talhao: {
                    type: 'object',
                    properties: {
                        id: { type: 'integer' },
                        codigo: { type: 'string' },
                        nome: { type: 'string' },
                        areaHectares: { type: 'number' },
                        cultura: { type: 'string' },
                        localizacao: { type: 'string' },
                        isAtivo: { type: 'boolean' },
                    },
                },
                Pivo: {
                    type: 'object',
                    properties: {
                        id: { type: 'integer' },
                        codigo: { type: 'string' },
                        nome: { type: 'string' },
                        talhaoId: { type: 'integer' },
                        tipo: { type: 'string' },
                        vazao: { type: 'number' },
                        raioAlcance: { type: 'number' },
                        isAtivo: { type: 'boolean' },
                    },
                },
            },
        },
        security: [
            {
                bearerAuth: [],
            },
        ],
    },
    apis: ['./app/controllers/*.ts', './start/routes.ts'],
}

const swaggerSpec = swaggerJsdoc(options)

export function setupSwagger(app: Application) {
    const router = app.container.make('router')

    router.get('/docs', async ({ response }) => {
        return response.redirect('/api-docs')
    })

    router.get('/api-docs', async ({ response }) => {
        const html = swaggerUi.generateHTML(swaggerSpec)
        response.header('Content-Type', 'text/html')
        return response.send(html)
    })

    router.get('/api-docs/swagger.json', async ({ response }) => {
        return response.json(swaggerSpec)
    })
}

export default swaggerSpec
