import axios from "axios";
import { startOfToday, startOfTomorrow, tryCatch } from "../common/helper";
import RateHistory from "../models/rateHistory";
import * as loggers from "../common/logger";

export const updateRate = async () => {
  const { data, error } = await tryCatch(
    axios.post("https://tasa.legendsoft.com/api/tasa/get")
  );
  if (error) {
    loggers.error(error.message);
  }

  if (data) {
    const exists = await RateHistory.findOne({
      validDate: data!.data.FechaValor,
    });
    if (!exists) {
      const rateHistory = new RateHistory({
        date: data!.data.Fecha,
        validDate: data!.data.FechaValor,
        usd: data!.data.USD,
        rub: data!.data.RUB,
        try: data!.data.TRY,
        cny: data!.data.CNY,
        eur: data!.data.EUR,
      });
      await rateHistory.save();
    }
  }
};

export const getRateS = async () => {
  const todayStart = startOfToday();
  const tomorrowStart = startOfTomorrow();

  const rate = await RateHistory.findOne({
    validDate: {
      $gte: todayStart, // Greater than or equal to the start of today
      $lt: tomorrowStart, // Less than the start of tomorrow
    },
  });

  if (rate) {
    updateRate();
    return rate;
  } else {
    const { data, error } = await tryCatch(
      axios.post("https://tasa.legendsoft.com/api/tasa/get")
    );
    if (error) {
      loggers.error(error.message);
    }

    if (data) {
      const exists = await RateHistory.findOne({
        validDate: data!.data.FechaValor,
      });
      if (!exists) {
        const rateHistory = new RateHistory({
          date: data!.data.Fecha,
          validDate: data!.data.FechaValor,
          usd: data!.data.USD,
          rub: data!.data.RUB,
          try: data!.data.TRY,
          cny: data!.data.CNY,
          eur: data!.data.EUR,
        });
        await rateHistory.save();
        loggers.info(`Tasa USD actualizada: ${data!.data.USD}`);
        return rateHistory;
      }
      return exists;
    }
    return null;
  }
};
