/* eslint-disable @typescript-eslint/naming-convention */
import type { HttpContext } from '@adonisjs/core/http'
import InternationalShipmentCarrier from '#models/international_shipment_carrier'
import {
  listCarriersValidator,
  toggleCarriersValidator,
  updateCarrierCredentialsValidator,
} from '#validators/shipping_carrier'

export default class InternationalShipmentCarrierController {
  public async list({ request, response }: HttpContext) {
    const {
      page = 1,
      limit = 10,
      search,
      is_enabled,
      sort_by_carrier,
      sort_by_created_at,
      sort_by_updated_at,
    } = await request.validateUsing(listCarriersValidator)

    const carriers = await InternationalShipmentCarrier.query()
      .if(search, (query) => {
        query.where('carrier', 'like', `%${search}%`)
      })
      .if(is_enabled !== undefined, (query) => {
        query.where('is_enabled', is_enabled as boolean)
      })
      .if(sort_by_carrier, (query) => {
        query.orderBy('carrier', sort_by_carrier)
      })
      .if(sort_by_created_at, (query) => {
        query.orderBy('created_at', sort_by_created_at)
      })
      .if(sort_by_updated_at, (query) => {
        query.orderBy('updated_at', sort_by_updated_at)
      })
      .if(!sort_by_created_at && !sort_by_updated_at, (query) => {
        query.orderBy('created_at', 'desc')
      })
      .paginate(page, limit)
    return response.ok({
      status: true,
      message: 'Shipment carriers fetched successfully',
      data: carriers,
    })
  }

  public async toggleCarrier({ params, request, response }: HttpContext) {
    const carrierId = params.id
    const { is_enabled } = await request.validateUsing(toggleCarriersValidator)
    const carrier = await InternationalShipmentCarrier.findOrFail(carrierId)
    carrier.is_enabled = is_enabled
    await carrier.save()

    return response.ok({
      status: true,
      message: `Carrier ${carrier.carrier} is now ${is_enabled ? 'enabled' : 'disabled'}`,
      data: carrier,
    })
  }

  public async updateCredentials({ params, request, response }: HttpContext) {
    const carrierId = params.id
    const payload = await request.validateUsing(updateCarrierCredentialsValidator)

    const carrier = await InternationalShipmentCarrier.findOrFail(carrierId)
    Object.assign(carrier, payload)
    await carrier.save()

    return response.ok({
      status: true,
      message: `Carrier ${carrier.carrier} credentials updated successfully`,
      data: carrier,
    })
  }
}
