'use strict';

async function get (ctx) {
   try {
      const models = ctx.fs.dc.models;
      const { type } = ctx.request.body;
      const { name } = ctx.query;

      let findOption = {
         where: {
            type
         }
      }
      if (name) {
         findOption.where.name = {
            $like: `%${name}%`
         }
      }
      const vehicleRes = await models.Statistic.findAll(findOption)

      ctx.status = 200;
      ctx.body = vehicleRes
   } catch (error) {
      ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
      ctx.status = 400;
      ctx.body = {
         message: typeof error == 'string' ? error : undefined
      }
   }
}

async function edit (ctx) {
   try {
      const models = ctx.fs.dc.models;
      const { id, name, count, type } = ctx.request.body;

      if (!id) {
         await models.Statistic.create({
            name, count, type: type
         })
      } else {
         await models.Statistic.update({
            name, count, type: type
         }, {
            where: {
               id: id
            }
         })
      }

      ctx.status = 204
   } catch (error) {
      ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
      ctx.status = 400;
      ctx.body = {
         message: typeof error == 'string' ? error : undefined
      }
   }
}

async function del (ctx) {
   try {
      const models = ctx.fs.dc.models;
      const { id } = ctx.params;

      await models.Statistic.destroy({
         where: {
            id: id
         }
      })

      ctx.status = 204
   } catch (error) {
      ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
      ctx.status = 400;
      ctx.body = {
         message: typeof error == 'string' ? error : undefined
      }
   }
}

async function specificGet (ctx) {
   try {
      const models = ctx.fs.dc.models;
      const { type } = ctx.query;
      const { nameOfBusinessOwner } = ctx.query;

      let findOption = {
         where: {
            type
         }
      }
      if (nameOfBusinessOwner) {
         findOption.where.nameOfBusinessOwner = {
            $like: `%${nameOfBusinessOwner}%`
         }
      }

      const vehicleRes = await models.MunicipalVehicle.findAll(findOption)

      ctx.status = 200;
      ctx.body = vehicleRes
   } catch (error) {
      ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
      ctx.status = 400;
      ctx.body = {
         message: typeof error == 'string' ? error : undefined
      }
   }
}

async function specificEdit (ctx) {
   try {
      const models = ctx.fs.dc.models;
      const data = ctx.request.body;

      if (!data.vehicleId) {
         const vehicleRes = await models.Vehicle.create(data)
      } else {
         const vehicleRes = await models.Vehicle.update(data, {
            where: {
               id: data.vehicleId
            }
         })
      }

      ctx.status = 204
   } catch (error) {
      ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
      ctx.status = 400;
      ctx.body = {
         message: typeof error == 'string' ? error : undefined
      }
   }
}

async function specificDel (ctx) {
   try {
      const models = ctx.fs.dc.models;
      const { vehicleId } = ctx.params;

      const vehicleRes = await models.Vehicle.destroy({
         where: {
            id: vehicleId
         }
      })

      ctx.status = 204
   } catch (error) {
      ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
      ctx.status = 400;
      ctx.body = {
         message: typeof error == 'string' ? error : undefined
      }
   }
}

async function businessGet (ctx) {
   try {
      const models = ctx.fs.dc.models;
      const { nameOfBusinessOwner } = ctx.query;

      let findOption = {
         where: {

         }
      }
      if (nameOfBusinessOwner) {
         findOption.where.nameOfBusinessOwner = {
            $like: `%${nameOfBusinessOwner}%`
         }
      }
      const businessRes = await models.MunicipalBusiness.findAll(findOption)

      ctx.status = 200;
      ctx.body = businessRes
   } catch (error) {
      ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
      ctx.status = 400;
      ctx.body = {
         message: typeof error == 'string' ? error : undefined
      }
   }
}

async function businessEdit (ctx) {
   try {
      const models = ctx.fs.dc.models;
      const data = ctx.request.body;

      if (!data.businessId) {
         await models.MunicipalBusiness.create(data)
      } else {
         await models.MunicipalBusiness.update(data, {
            where: {
               id: data.businessId
            }
         })
      }

      ctx.status = 204
   } catch (error) {
      ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
      ctx.status = 400;
      ctx.body = {
         message: typeof error == 'string' ? error : undefined
      }
   }
}

async function businessDel (ctx) {
   try {
      const models = ctx.fs.dc.models;
      const { businessId } = ctx.params;

      await models.Vehicle.MunicipalBusiness({
         where: {
            id: businessId
         }
      })

      ctx.status = 204
   } catch (error) {
      ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
      ctx.status = 400;
      ctx.body = {
         message: typeof error == 'string' ? error : undefined
      }
   }
}

module.exports = {
   get, edit, del,
   specificGet, specificEdit, specificDel,
   businessGet, businessEdit, businessDel
};