const path = require("path");
const Dinero = require("dinero.js");
const { gql } = require("graphql-request");
const queries = require("./server/graphql-client/queries");
const GraphQLClient = require("graphql-request").GraphQLClient;
const logger = require("./server/utils/logger");
const AxiosLib = require("axios").default;
const axios = AxiosLib.create();

// Dinero.defaultCurrency = "USD";
// Dinero.globalLocale = "en-CA";
Dinero.globalRoundingMode = "HALF_EVEN";
const client = require("./server/graphql-client/graphql-client").client;
require("dotenv").config({
  path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`)
});

async function RunTheTest() {
  const bodyshopids = ["b501bb82-22b2-493a-8a0f-152938194869"];
  const bearerToken = `Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImJhNjI1OTZmNTJmNTJlZDQ0MDQ5Mzk2YmU3ZGYzNGQyYzY0ZjQ1M2UiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiUm9tZSBEZXZlbG9wbWVudCIsImh0dHBzOi8vaGFzdXJhLmlvL2p3dC9jbGFpbXMiOnsieC1oYXN1cmEtZGVmYXVsdC1yb2xlIjoidXNlciIsIngtaGFzdXJhLWFsbG93ZWQtcm9sZXMiOlsidXNlciJdLCJ4LWhhc3VyYS11c2VyLWlkIjoidDZZbTFORGxDRE9QWnIzRjliZ3VXSDRMaFNYMiJ9LCJpb2FkbWluIjp0cnVlLCJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vcm9tZS1wcm9kLTEiLCJhdWQiOiJyb21lLXByb2QtMSIsImF1dGhfdGltZSI6MTcxMDk1MTg1MCwidXNlcl9pZCI6InQ2WW0xTkRsQ0RPUFpyM0Y5Ymd1V0g0TGhTWDIiLCJzdWIiOiJ0NlltMU5EbENET1BacjNGOWJndVdINExoU1gyIiwiaWF0IjoxNzExNTczODI1LCJleHAiOjE3MTE1Nzc0MjUsImVtYWlsIjoicGF0cmlja0Byb21lLmRldiIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJlbWFpbCI6WyJwYXRyaWNrQHJvbWUuZGV2Il19LCJzaWduX2luX3Byb3ZpZGVyIjoicGFzc3dvcmQifX0.0kBySA9tJznLYj8TtncHGVWJO0IcmLKP2G1UyyXwaj45kTa25bjT9RWjM-NslX_zjOvrvmQZzisFAb6M1Jf6geNjOMLIqb8bhihhzEZK4CcRfvjT6cpZxnOO2Dp_1Y5OePbvOBS_GlfdsovVWa84OLuhYC5G_3QwHT8_2Cttz4CbrC6M_vd7QsGODJYBbVKMhOdZhzpNq7AbOUh3749WRjLMMobpnZDrmQlsyg3PAqtX1FHO25WQS2rma9QahGDSY736JfbkuZJ2XbNn0axEGpK7RQLUcuRkFUlfKqYplNbR_e1Q3kEfRAZpxBPXZysrDcbDNhbkWCoTmJ3fle55OA`;
  const { jobs } = await client.request(
    gql`
      query GET_JOBS($bodyshopids: [uuid!]!) {
        jobs(where: { shopid: { _in: $bodyshopids } }, order_by: { created_at: desc }) {
          id
          ro_number
          job_totals
          cieca_ttl
        }
      }
    `,
    {
      bodyshopids
    }
  );

  const results = [];

  for (const [index, job] of jobs.entries()) {
    process.stdout.cursorTo(0);
    process.stdout.write(
      `Processing job ${index + 1} of ${jobs.length}. Failed jobs: ${results.filter((r) => r.result !== "PASS").length}`
    );

    try {
      await axios.post(
        `http://localhost:4000/job/totalsssu`,
        { id: job.id },
        { headers: { Authorization: bearerToken } }
      );
      const { jobs_by_pk: newjob } = await client.request(
        gql`
          query GET_JOBS($id: uuid!) {
            jobs_by_pk(id: $id) {
              id
              ro_number
              cieca_ttl
              job_totals
              ownr_fn
              ownr_ln
              ownr_co_nm
              ins_co_nm
              comment
            }
          }
        `,
        {
          id: job.id
        }
      );

      const result = {
        id: newjob.id,
        owner: `${newjob.ownr_fn} ${newjob.ownr_ln} ${job.ownr_co_nm || ""}`,
        ins_co: newjob.ins_co_nm,
        comment: newjob.comment
      };

      const calcTotal = newjob.job_totals.totals.total_repairs.amount;
      const ttlTotal = newjob.cieca_ttl.data.g_ttl_amt * 100;
      result.difference = (calcTotal - ttlTotal) / 100;

      if (Math.abs(calcTotal - ttlTotal) > 3) {
        //Diff is greater than 5 cents. Fail it.
        result.result = "***FAIL***";
      } else {
        result.result = "PASS";
      }
      // console.log(`${result.result} => RO ${job.ro_number} - ${job.id} `);

      results.push(result);
    } catch (error) {
      results.push({
        ro_number: job.ro_number,
        id: job.id,
        result: "**503 FAILURE**"
      });
    }
  }

  console.table(results.filter((r) => r.result !== "PASS"));
  const summary = results.reduce(
    (acc, val) => {
      if (val.result === "PASS") {
        return { ...acc, pass: acc.pass + 1 };
      } else {
        return { ...acc, fail: acc.fail + 1 };
      }
    },
    { pass: 0, fail: 0 }
  );
  console.log("Pass Rate: ", ((summary.pass / (summary.fail + summary.pass)) * 100).toFixed(1));
}

RunTheTest();

// mutation {
//   delete_jobs(where: {shopid: {_eq: "a7ee1503-ee05-4a02-b80e-bdb11d1cc8ac"}}) {
//     affected_rows
//   }
//   delete_owners(where: {shopid: {_eq: "a7ee1503-ee05-4a02-b80e-bdb11d1cc8ac"}}) {
//     affected_rows
//   }
//   delete_vehicles(where: {shopid: {_eq: "a7ee1503-ee05-4a02-b80e-bdb11d1cc8ac"}}) {
//     affected_rows
//   }
// }
