import express from "express";

import {CreateTicketWorkflow} from "../bl/ticket/create-ticket.workflow";
import {Ticket} from "../entity/ticket";

import {CreateTicketRequest} from "./classes/create-ticket.request";
import parser from "./classes/parser";
import {Response} from "./classes/response";
import {ResolvedTicketSerialized} from "./classes/serialized/resolved-ticket.serialized";
import {TicketSerialized} from "./classes/serialized/ticket.serialized";
import {TicketListItem} from "./classes/ticket-list-item";

const router = express.Router();

router.post('/', async (req: express.Request, res: express.Response, next) => {
  try {
    const ticket = await CreateTicketWorkflow.create(parser.deserializeObject(req.body, CreateTicketRequest));
    console.log('tick', ticket);
    Response.buildSuccess(
      'Ticket successfully created',
      parser.serializeObject(await TicketSerialized.createFromObj(ticket))
    ).send(res);
  } catch (e) {
    next(e);
  }
});

router.get('/:licenseeId', async (req: express.Request, res: express.Response, next) => {
  try {
    const tickets = await Ticket.find({licenseeId: parseFloat(req.params.licenseeId)});
    Response.buildSuccess<TicketSerialized[]>(
      'Ticket list successfully received',
      parser.serializeArray(
        await Promise.all(tickets.map(t => TicketListItem.createFromEntity(t)))
      )
    ).send(res);
  } catch (e) {
    next(e);
  }
});

router.get('/:licenseeId/:ticketId', async (req: express.Request, res: express.Response, next) => {
  try {
    const ticket = await Ticket.findOne({
      where: {
        id: req.params.ticketId,
        licenseeId: req.params.licenseeId
      }
    });

    if (ticket != null) {
      ticket.lastQueriedOn = new Date();
      await ticket.save();

      Response.buildSuccess(
        'Ticket received successfully',
        parser.serializeObject(await ResolvedTicketSerialized.createResolvedFromObj(ticket), ResolvedTicketSerialized)
      ).send(res);
    } else {
      Response.buildError('No Ticket found for given query', undefined, 400).send(res);
    }
  } catch (e) {
    next(e);
  }
});

export default router;
