/*
 * (c) 2022 Pluto Inc.
 */
package tv.pluto.mongo.utils.equals;

import com.plutotv.test.lib.LogUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import tv.pluto.mongo.entities.placeholder.Clip;
import tv.pluto.mongo.entities.placeholder.Country;
import tv.pluto.mongo.utils.PlaceholderUtils;

public class PlaceholderEqualsUtils {
  PlaceholderUtils placeholderUtils = new PlaceholderUtils();

  public void verifyComplexBumperSetsEquals(
      Map<String, Country> mongoComplexBumperSets,
      Map<String, tv.pluto.ip.dal.placeholder.Placeholder.Country> grpcComplexBumperSets) {

    List<String> mongoCountriesKeys = new ArrayList<>(mongoComplexBumperSets.keySet());
    List<String> grpcCountriesKeys = new ArrayList<>(grpcComplexBumperSets.keySet());

    Collections.sort(mongoCountriesKeys);
    Collections.sort(grpcCountriesKeys);

    if (!mongoCountriesKeys.equals(grpcCountriesKeys)) {
      LogUtils.logSevereMessageThenFail(
          "Countries don't match "
              + "\n mongoCountriesKeys = "
              + mongoCountriesKeys
              + "\n grpcCountriesKeys = "
              + grpcCountriesKeys);
    }

    grpcCountriesKeys.forEach(
        countryKey -> {
          List<String> mongoBumperSetsKeys =
              new ArrayList<>(mongoComplexBumperSets.get(countryKey).getBumperSets().keySet());
          List<String> grpcBumperSetsKeys =
              new ArrayList<>(grpcComplexBumperSets.get(countryKey).getBumperSetsMap().keySet());

          Collections.sort(mongoBumperSetsKeys);
          Collections.sort(grpcBumperSetsKeys);

          if (!mongoBumperSetsKeys.equals(grpcBumperSetsKeys)) {
            LogUtils.logSevereMessageThenFail(
                "BumperSets keys don't match for country = "
                    + countryKey
                    + "\n mongoBumperSetsKeys = "
                    + mongoBumperSetsKeys
                    + "\n grpcBumperSetsKeys = "
                    + grpcBumperSetsKeys);
          } else {
            grpcBumperSetsKeys.forEach(
                bumperSetsKey -> {
                  List<Clip> mongoPostBumpers =
                      mongoComplexBumperSets
                          .get(countryKey)
                          .getBumperSets()
                          .get(bumperSetsKey)
                          .getPostBumpers();
                  List<Clip> mongoPreBumpers =
                      mongoComplexBumperSets
                          .get(countryKey)
                          .getBumperSets()
                          .get(bumperSetsKey)
                          .getPreBumpers();

                  List<Clip> grpcPostBumpers =
                      placeholderUtils.mapGrpcObjectsToPojo(
                          grpcComplexBumperSets
                              .get(countryKey)
                              .getBumperSetsMap()
                              .get(bumperSetsKey)
                              .getPostBumpersList(),
                          Clip.class);
                  List<Clip> grpcPreBumpers =
                      placeholderUtils.mapGrpcObjectsToPojo(
                          grpcComplexBumperSets
                              .get(countryKey)
                              .getBumperSetsMap()
                              .get(bumperSetsKey)
                              .getPreBumpersList(),
                          Clip.class);

                  mongoPostBumpers.sort(Comparator.comparing(Clip::getId));
                  mongoPreBumpers.sort(Comparator.comparing(Clip::getId));
                  grpcPostBumpers.sort(Comparator.comparing(Clip::getId));
                  grpcPreBumpers.sort(Comparator.comparing(Clip::getId));

                  if (!mongoPostBumpers.equals(grpcPostBumpers)
                      && !mongoPreBumpers.equals(grpcPreBumpers)) {
                    LogUtils.logSevereMessageThenFail(
                        "countryKey = "
                            + countryKey
                            + "\nmongoPostBumpers = "
                            + mongoPostBumpers
                            + "\ngrpcPostBumpers  = "
                            + grpcPostBumpers
                            + "\nmongoPreBumpers  = "
                            + mongoPreBumpers
                            + "\ngrpcPreBumpers   = "
                            + grpcPreBumpers);
                  }
                });
          }
        });
  }
}
