import Produto from '#models/produto'
import { HttpContext } from '@adonisjs/core/http'

export default class ProdutosController {
  /**
   * Display a list of produtos
   */
  async index({ request, response }: HttpContext) {
    const page = request.input('page', 1)
    const limit = request.input('limit', 10)
    const search = request.input('search', '')
    const categoria = request.input('categoria', '')

    const query = Produto.query()

    if (search) {
      query.where((builder) => {
        builder
          .where('nome', 'ILIKE', `%${search}%`)
          .orWhere('codigo_psu', 'ILIKE', `%${search}%`)
          .orWhere('artigo', 'ILIKE', `%${search}%`)
      })
    }

    if (categoria) {
      query.where('categoria', categoria)
    }

    const produtos = await query.paginate(page, limit)

    return response.ok(produtos)
  }

  /**
   * Search produtos
   */
  async search({ request, response }: HttpContext) {
    const term = request.input('term', '')

    const produtos = await Produto.query()
      .where((builder) => {
        builder
          .where('nome', 'ILIKE', `%${term}%`)
          .orWhere('codigo_psu', 'ILIKE', `%${term}%`)
          .orWhere('artigo', 'ILIKE', `%${term}%`)
      })
      .limit(20)

    return response.ok(produtos)
  }

  /**
   * Create a new produto
   */
  async store({ request, response }: HttpContext) {
    const data = request.only([
      'codigo_psu',
      'artigo',
      'nome',
      'descricao',
      'valor',
      'moeda',
      'marca',
      'categoria',
      'estoque',
    ])

    try {
      const produto = await Produto.create(data)
      return response.created(produto)
    } catch (error) {
      return response.badRequest({ message: 'Failed to create produto', error: error.message })
    }
  }

  /**
   * Display a single produto
   */
  async show({ params, response }: HttpContext) {
    try {
      const produto = await Produto.findOrFail(params.id)
      return response.ok(produto)
    } catch (error) {
      return response.notFound({ message: 'Produto not found' })
    }
  }

  /**
   * Update produto
   */
  async update({ params, request, response }: HttpContext) {
    try {
      const produto = await Produto.findOrFail(params.id)
      const data = request.only([
        'codigo_psu',
        'artigo',
        'nome',
        'descricao',
        'valor',
        'moeda',
        'marca',
        'categoria',
        'estoque',
      ])

      produto.merge(data)
      await produto.save()

      return response.ok(produto)
    } catch (error) {
      return response.badRequest({ message: 'Failed to update produto', error: error.message })
    }
  }

  /**
   * Delete produto
   */
  async destroy({ params, response }: HttpContext) {
    try {
      const produto = await Produto.findOrFail(params.id)
      await produto.delete()

      return response.ok({ message: 'Produto deleted successfully' })
    } catch (error) {
      return response.badRequest({ message: 'Failed to delete produto', error: error.message })
    }
  }
}
