"use strict";
const Sequelize = require("sequelize");

const getStateText = (inscription) => {
  if (inscription.type !== "online" && inscription !== "online group") {
    if (inscription.validated == true) {
      return "Inscripción confirmada";
    } else if (inscription.overflowEventId) {
      return "Inscripción confirmada a lista de espera";
    } else if (inscription.reservationId) {
      return "Reserva pendiente de confirmación";
    } else return "N/A";
  } else {
    // online
    return "Inscripción online confirmada";
  }
};

module.exports = function (sequelize, DataTypes) {
  const EventInscription = sequelize.define(
    "EventInscription",
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        primaryKey: true,
      },
      date: {
        type: DataTypes.DATE,
      },
      code_ticket: {
        type: DataTypes.STRING(45),
      },
      type: {
        type: DataTypes.STRING,
        allowNull: false,
        defaultValue: "onsite", //grupal, invitacion-regular, invitation-grupal, online, online group, onsite, onsite group
      },
      source: {
        type: DataTypes.STRING, //app, web
      },
      marketing_memberId: {
        type: DataTypes.STRING,
      },
      validated: {
        type: DataTypes.BOOLEAN,
      },
      stateText: {
        type: Sequelize.VIRTUAL(Sequelize.STRING, ["validated", "reservationId", "overflowEventId", "type"]),
        get: function () {
          return getStateText(this);
        },
      },
      reservationId: {
        //contendra el id de la reserva o de la lista de espera de la reserva
        type: DataTypes.UUID,
        foreignKey: true,
      },
      overflowEventId: {
        //contendra el id del evento de lista de espera del evento
        type: DataTypes.UUID,
        foreignKey: true,
      },
    },
    {
      tableName: "events_inscriptions",
      freezeTableName: true,
      timestamps: true,

      defaultScope: {
        order: [["date", "DESC"]],
        include: [
          {
            model: sequelize.models.User,
            as: "user",
            include: [{ model: sequelize.models.Entity, attributes: ["id", "name"], required: false }],
          },
        ],
      },
    }
  );

  EventInscription.associate = function (models) {
    EventInscription.Event = EventInscription.belongsTo(models.Event, { foreignKey: "eventId", as: "event" });
    EventInscription.Reservation = EventInscription.belongsTo(models.EventReservation, {
      foreignKey: "reservationId",
      as: "reservation",
    });
    EventInscription.User = EventInscription.belongsTo(models.User, { foreignKey: "userId", as: "user" });
    EventInscription.UserValidate = EventInscription.belongsTo(models.User, { foreignKey: "validateUserId" });
  };

  EventInscription.addScope("includeEventAndVenue", () => {
    return {
      include: [
        {
          model: sequelize.models.Event,
          as: "event",
          attributes: [
            "id",
            "name",
            "description",
            "campaign_text",
            "init_date",
            "end_date",
            "init_available_date",
            "end_available_date",
            "stateCode",
            "stateText",
            "marketing_list",
            "assistants",
          ],
          include: [
            {
              model: sequelize.models.Venue,
              as: "venue",
              attributes: {
                exclude: ["createdAt", "updatedAt"],
              },
            },
          ],
        },
      ],
    };
  });

  EventInscription.addScope("includeReservation", () => {
    return {
      include: [
        {
          model: sequelize.models.EventReservation,
          as: "reservation",
          require: false,
          include: [
            {
              model: sequelize.models.Entity,
              required: false,
            },
          ],
        },
      ],
    };
  });

  EventInscription.addScope("includeUser", () => {
    return {
      include: [
        {
          model: sequelize.models.User,
          as: "user",
        },
      ],
    };
  });

  return EventInscription;
};
