import { Request, Response } from 'express'
import { getRepository } from 'typeorm'
import { Prestamo } from '@src/entity/Prestamo'
import * as moment from 'moment'
import { Horario } from '@src/entity/Horario'
import { Usuario } from '@src/entity/Usuario'
import { Equipo } from '@src/entity/Equipo'

export class ResevacionController {
  static async espaciosDisponibles (req: Request, res: Response) {
    const repository = getRepository(Horario)
    const fecha = moment().format('L')
    console.log(fecha)
    const espacios = await repository
      .createQueryBuilder('horario')
      .leftJoinAndSelect('horario.prestamos', 'prestamo')
      .where('prestamo.createdAt >= :fecha', { fecha })
      .groupBy('horario.hora')
      .getMany()
    return res.status(200).json(espacios)
  }

  static async reservar (req: Request, res: Response) {
    const prestamoRepository = getRepository(Prestamo)
    const horarioRepository = getRepository(Horario)
    const usuarioRepository = getRepository(Usuario)
    const equipoRepository = getRepository(Equipo)

    const { usuarioId, tipoId, horarioId } = req.body

    const usuario = await usuarioRepository.findOne(usuarioId, {
      select: ['id', 'baja', 'multa']
    })

    if (!usuario) {
      res.status(400).json({ err: 'Usuario no encontrado' })
      return
    }

    if (usuario.baja) {
      res.status(400).json({ err: 'El usuario esta dado de baja' })
      return
    }
    const horario = await horarioRepository.findOne(horarioId)

    if (!horario) {
      res.status(400).json({ err: 'El horario no existe' })
    }

    const prestamoActivo = await prestamoRepository
      .createQueryBuilder('prestamo')
      .where('prestamo.usuarioId = :idUsuario', { idUsuario: usuario.id })
      .andWhere('prestamo.activo = true')
      .orWhere('prestamo.reservado = true')
      .getOne()

    if (prestamoActivo) {
      res.status(400).json({ err: 'El usuario tiene un prestamo activo' })
    }
    const equipo = await equipoRepository
      .createQueryBuilder('equipo')
      .leftJoinAndSelect('equipo.carrito', 'carrito')
      .leftJoinAndSelect('carrito.tipo', 'tipo')
      .where('equipo.activo = :activo', { activo: false })
      .andWhere('carrito.kiosko = :kiosko', { kiosko: 3 })
      .andWhere('tipo.id = :tipoId', { tipoId })
      .orderBy('equipo.updatedAt', 'ASC')
      .getOne()

    const prestamo = new Prestamo()
    const horamax = horario.hora.split('-')[1].split(':')[0]
    const m = moment()
      .hour(+horamax)
      .minute(0)
      .toLocaleString()

    equipo.activo = true

    prestamo.equipo = equipo
    prestamo.usuario = usuario
    prestamo.horaMaxEntrega = m
    prestamo.horario = horario

    await equipoRepository.save(equipo)
    await prestamoRepository.save(prestamo)

    prestamo.qr = `https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=${prestamo.id}`

    console.log(prestamo)
    res.status(200).json({
      prestamo
    })
  }
}
