const mongoose = require('mongoose').set('debug', false);
const Schema = mongoose.Schema;

const escapeStringRegexp = require('escape-string-regexp');

mongoose.Promise = global.Promise;
mongoose.level = 'F';

const tools = require('../tools/general');

const { ObjectId } = require('mongodb');

const shared_consts = require('../tools/shared_nodejs');

// Resolving error Unknown modifier: $pushAll
mongoose.plugin((schema) => {
  schema.options.usePushEach = true;
});

const ProvinceSchema = new Schema(
  {
    _id: {
      type: Number,
    },
    reg: {
      type: String,
    },
    prov: {
      type: String,
      // unique: true,
      maxlength: 3,
    },
    idCircuitToAssign: {
      type: String,
    },
    descr: {
      type: String,
    },
    link_grp: {
      type: String,
    },
    card: {
      type: String,
    },

    link_telegram: {
      type: String,
    },
    lat: {
      type: Number,
    },
    long: {
      type: Number,
    },
  },
  { _id: false }
);

ProvinceSchema.pre('save', async function (next) {
  if (this.isNew) {
    const myrec = await Province.findOne().limit(1).sort({ _id: -1 });
    if (!!myrec) {
      if (myrec._doc._id === 0) this._id = 1;
      else this._id = myrec._doc._id + 1;
    } else {
      this._id = 1;
    }
  }

  next();
});

ProvinceSchema.statics.getRegionByStrProvince = async function (strprovince) {
  const myrec = await Province.findOne({ prov: strprovince }).lean();
  if (myrec) {
    return myrec.reg;
  }

  return '';
};

ProvinceSchema.statics.getStrProvinceByProv = async function (prov) {
  const myrec = await Province.findOne({ prov }).lean();
  if (myrec) {
    return myrec.descr;
  }

  return '';
};

ProvinceSchema.statics.getFieldsForSearch = function () {
  return [
    { field: 'prov', type: tools.FieldType.string },
    { field: 'descr', type: tools.FieldType.string },
  ];
};

ProvinceSchema.statics.executeQueryTable = function (idapp, params) {
  params.fieldsearch = this.getFieldsForSearch();

  const strfind = params.search;

  if (strfind === '') {
    return [];
  }

  return tools.executeQueryTable(this, 0, params);
};

ProvinceSchema.statics.executeQueryPickup = async function (idapp, params) {
  const strfind = params.search;

  if (strfind === '') {
    return [];
  }

  let filterfindexact = { descr: strfind };
  const risexact = await Province.find(filterfindexact).lean();

  let filterfind = {};

  filterfind = { descr: { $regex: '^' + strfind, $options: 'i' } };

  const ris = await Province.find(filterfind).lean().limit(10);

  return [...risexact, ...ris];
};

ProvinceSchema.statics.findAllIdApp = async function (idapp) {
  const myfind = {};

  return Province.find(myfind).sort({ descr: 1 }).lean();
};

ProvinceSchema.statics.setCoordinatesOnDB = async function () {
  const arrprov = await Province.find({}).lean();

  // Funzione per ottenere le coordinate di tutte le città
  for (const prov of arrprov) {
    if (!prov.lat) {
      let coord = await tools.getCityCoordinates(prov);
      if (coord) {
        let ris = await Province.findOneAndUpdate(
          { _id: prov._id },
          { $set: { lat: coord.lat, long: coord.long } },
          { new: true }
        );
        console.log('   *** Update ', prov.descr, 'lat', ris.lat, 'long', ris.long);
      }
    }
  }
};

const Province = mongoose.model('Province', ProvinceSchema);

Province.createIndexes()
  .then(() => {})
  .catch((err) => {
    throw err;
  });

module.exports = { Province };
