/*
   * This function is used to determine if the player clicked on the inside of a solid wooden box.
   *
   * Returns NPCHouse of what you clicked on, whether it's a real building or not. The returned
   * NPCHouse has a boolean to indicate if it is a valid house or not.
   */
  public static NPCHouse isBox(World worldIn, BlockPos pos, EnumFacing side) {
    BlockPos une = pos, unw = pos, use = pos, usw = pos, dne = pos, dnw = pos, dse = pos, dsw = pos;
    boolean isBuilding = false;

    // D-U-N-S-W-E
    assess:
    switch (side.getIndex()) {
      case 0: // assume ceiling
        // while not wall && wood, go in direction to find wall
        // know is ceiling, so we can us a block at least 2 below  && can only click ceiling from
        // inside, so one in any Cardinal direction can be assumed as wood for wall checks
        // move east and west, checking if wall with 2 blocks down and 1 block north  (neCorner
        une = pos.north().east();
        unw = pos.north().west();
        use = pos.south().east();
        usw = pos.south().west();
        // make sure all start corners are actually wood, else fail
        if (!(BlockHelper.isWooden(worldIn, une)
            && BlockHelper.isWooden(worldIn, unw)
            && BlockHelper.isWooden(worldIn, use)
            && BlockHelper.isWooden(worldIn, usw))) {
          isBuilding = false;
          break assess;
        }
        // these are clearly not wooden, but we need them to check for walls, when they become
        // wooden, we have found walls
        dne = une.down();
        dnw = unw.down();
        dse = use.down();
        dsw = usw.down();
        if ((BlockHelper.isWooden(worldIn, dne)
            && BlockHelper.isWooden(worldIn, dnw)
            && BlockHelper.isWooden(worldIn, dse)
            && BlockHelper.isWooden(worldIn, dsw))) {
          isBuilding = false;
          break assess;
        }
        // move corners to find walls in order, north, south, east, west
        while (!BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)) {
          // if we're no longer looking at wood, then it's not a domicile, so fail
          if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, unw))) {
            isBuilding = false;
            break assess;
          }
          une = une.north();
          unw = unw.north();
          dne = dne.north();
          dnw = dnw.north();
        }
        while (!BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)) {
          // if we're no longer looking at wood, then it's not a domicile, so fail
          if (!(BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, usw))) {
            isBuilding = false;
            break assess;
          }
          use = use.south();
          usw = usw.south();
          dse = dse.south();
          dsw = dsw.south();
        }
        while (!BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)) {
          // if we're no longer looking at wood, then it's not a domicile, so fail
          if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, use))) {
            isBuilding = false;
            break assess;
          }
          une = une.east();
          use = use.east();
          dne = dne.east();
          dse = dse.east();
        }
        while (!BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw)) {
          // if we're no longer looking at wood, then it's not a domicile, so fail
          if (!(BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, usw))) {
            isBuilding = false;
            break assess;
          }
          unw = unw.west();
          usw = usw.west();
          dnw = dnw.west();
          dsw = dsw.west();
        }
        // We now have the real upper corners of the building, let's find out if we have a floor!
        // :)
        while (!BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)) {
          if (!(BlockHelper.isWooden(worldIn, dne)
              && BlockHelper.isWooden(worldIn, dnw)
              && BlockHelper.isWooden(worldIn, dse)
              && BlockHelper.isWooden(worldIn, dsw))) {
            // for some reason it's going past all of them and I've no f*****g clue why.

            isBuilding = false;
            break assess;
          }
          dne = dne.down();
          dnw = dnw.down();
          dse = dse.down();
          dsw = dsw.down();
        }
        // This should be all of our corners.  Let's run another check on every wall and floor just
        // to make sure its' not missing pieces on us.  :D
        if ((BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)
            && BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)
            && BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)
            && BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)
            && BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)
            && BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw))) {
          isBuilding = true;
          break assess;
        }
        isBuilding = false;
        break assess;
      case 1: // assume floor
        dne = pos.north().east();
        dnw = pos.north().west();
        dse = pos.south().east();
        dsw = pos.south().west();
        if (!(BlockHelper.isWooden(worldIn, dne)
            && BlockHelper.isWooden(worldIn, dnw)
            && BlockHelper.isWooden(worldIn, dse)
            && BlockHelper.isWooden(worldIn, dsw))) {
          isBuilding = false;
          break assess;
        }
        une = dne.up();
        unw = dnw.up();
        use = dse.up();
        usw = dsw.up();
        if ((BlockHelper.isWooden(worldIn, une)
            && BlockHelper.isWooden(worldIn, unw)
            && BlockHelper.isWooden(worldIn, use)
            && BlockHelper.isWooden(worldIn, usw))) {
          isBuilding = false;
          break assess;
        }
        // Start finding Walls in order: N-S-E-W
        while (!BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)) {
          if (!(BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dnw))) {
            isBuilding = false;
            break assess;
          }
          une = une.north();
          unw = unw.north();
          dne = dne.north();
          dnw = dnw.north();
        }
        while (!BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)) {
          if (!(BlockHelper.isWooden(worldIn, dse) && BlockHelper.isWooden(worldIn, dsw))) {
            isBuilding = false;
            break assess;
          }
          use = use.south();
          usw = usw.south();
          dse = dse.south();
          dsw = dsw.south();
        }
        while (!BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)) {
          if (!(BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dse))) {
            isBuilding = false;
            break assess;
          }
          une = une.east();
          use = use.east();
          dne = dne.east();
          dse = dse.east();
        }
        while (!BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw)) {
          if (!(BlockHelper.isWooden(worldIn, dnw) && BlockHelper.isWooden(worldIn, dsw))) {
            isBuilding = false;
            break assess;
          }
          unw = unw.west();
          usw = usw.west();
          dnw = dnw.west();
          dsw = dsw.west();
        }
        // Find the Roof!
        while (!BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)) {
          if (!(BlockHelper.isWooden(worldIn, une)
              && BlockHelper.isWooden(worldIn, unw)
              && BlockHelper.isWooden(worldIn, use)
              && BlockHelper.isWooden(worldIn, usw))) {
            isBuilding = false;
            break assess;
          }
          une = une.up();
          unw = unw.up();
          use = use.up();
          usw = usw.up();
        }
        if ((BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)
            && BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)
            && BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)
            && BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)
            && BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)
            && BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw))) {
          isBuilding = true;
          break assess;
        }
        isBuilding = false;
        break assess;

      case 2: // assume ewWall (North facing side)
        use = pos.up().east();
        usw = pos.up().west();
        dse = pos.down().east();
        dsw = pos.down().west();
        if (!(BlockHelper.isWooden(worldIn, use)
            && BlockHelper.isWooden(worldIn, usw)
            && BlockHelper.isWooden(worldIn, dse)
            && BlockHelper.isWooden(worldIn, dsw))) {
          isBuilding = false;
          break assess;
        }
        une = use.north();
        unw = usw.north();
        dne = dse.north();
        dnw = dsw.north();
        if ((BlockHelper.isWooden(worldIn, une)
            && BlockHelper.isWooden(worldIn, unw)
            && BlockHelper.isWooden(worldIn, dne)
            && BlockHelper.isWooden(worldIn, dnw))) {
          isBuilding = false;
          break assess;
        }
        // First, we check Ceiling and Floor
        while (!BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)) {
          if (!(BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, usw))) {
            isBuilding = false;
            break assess;
          }
          une = une.up();
          unw = unw.up();
          use = use.up();
          usw = usw.up();
        }
        while (!BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)) {
          if (!(BlockHelper.isWooden(worldIn, dse) && BlockHelper.isWooden(worldIn, dsw))) {
            isBuilding = false;
            break assess;
          }
          dne = dne.down();
          dnw = dnw.down();
          dse = dse.down();
          dsw = dsw.down();
        }
        // Now we check the Eastern and Western Walls
        while (!BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)) {
          if (!(BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, dse))) {
            isBuilding = false;
            break assess;
          }
          une = une.east();
          use = use.east();
          dne = dne.east();
          dse = dse.east();
        }
        while (!BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw)) {
          if (!(BlockHelper.isWooden(worldIn, usw) && BlockHelper.isWooden(worldIn, dsw))) {
            isBuilding = false;
            break assess;
          }
          unw = unw.west();
          usw = usw.west();
          dnw = dnw.west();
          dsw = dsw.west();
        }
        // Finally, we check for the North Wall
        while (!BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)) {
          if (!(BlockHelper.isWooden(worldIn, une)
              && BlockHelper.isWooden(worldIn, unw)
              && BlockHelper.isWooden(worldIn, dne)
              && BlockHelper.isWooden(worldIn, dnw))) {
            isBuilding = false;
            break assess;
          }
          une = une.north();
          unw = unw.north();
          dne = dne.north();
          dnw = dnw.north();
        }
        if ((BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)
            && BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)
            && BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)
            && BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)
            && BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)
            && BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw))) {
          isBuilding = true;
          break assess;
        }
        isBuilding = false;
        break assess;
      case 3: // assume ewWall (South facing Wall - North wall of room)
        une = pos.up().east();
        unw = pos.up().west();
        dne = pos.down().east();
        dnw = pos.down().west();
        if (!(BlockHelper.isWooden(worldIn, une)
            && BlockHelper.isWooden(worldIn, unw)
            && BlockHelper.isWooden(worldIn, dne)
            && BlockHelper.isWooden(worldIn, dnw))) {
          isBuilding = false;
          break assess;
        }
        use = une.south();
        usw = unw.south();
        dse = dne.south();
        dsw = dnw.south();
        if ((BlockHelper.isWooden(worldIn, use)
            && BlockHelper.isWooden(worldIn, usw)
            && BlockHelper.isWooden(worldIn, dse)
            && BlockHelper.isWooden(worldIn, dsw))) {
          isBuilding = false;
          break assess;
        }
        // First, we check Ceiling and Floor
        while (!BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)) {
          if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, unw))) {
            isBuilding = false;
            break assess;
          }
          une = une.up();
          unw = unw.up();
          use = use.up();
          usw = usw.up();
        }
        while (!BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)) {
          if (!(BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dnw))) {
            isBuilding = false;
            break assess;
          }
          dne = dne.down();
          dnw = dnw.down();
          dse = dse.down();
          dsw = dsw.down();
        }
        // Now we check the Eastern and Western Walls
        while (!BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)) {
          if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, dne))) {
            isBuilding = false;
            break assess;
          }
          une = une.east();
          use = use.east();
          dne = dne.east();
          dse = dse.east();
        }
        while (!BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw)) {
          if (!(BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, dnw))) {
            isBuilding = false;
            break assess;
          }
          unw = unw.west();
          usw = usw.west();
          dnw = dnw.west();
          dsw = dsw.west();
        }
        // Finally, we check for the South Wall
        while (!BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)) {
          if (!(BlockHelper.isWooden(worldIn, use)
              && BlockHelper.isWooden(worldIn, usw)
              && BlockHelper.isWooden(worldIn, dse)
              && BlockHelper.isWooden(worldIn, dsw))) {
            isBuilding = false;
            break assess;
          }
          use = use.south();
          usw = usw.south();
          dse = dse.south();
          dsw = dsw.south();
        }
        if ((BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)
            && BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)
            && BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)
            && BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)
            && BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)
            && BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw))) {
          isBuilding = true;
          break assess;
        }
        isBuilding = false;
        break assess;
      case 4: // assume nsWall (West Facing Wall - Eastern wall of room)
        une = pos.up().north();
        use = pos.up().south();
        dne = pos.down().north();
        dse = pos.down().south();
        if (!(BlockHelper.isWooden(worldIn, une)
            && BlockHelper.isWooden(worldIn, use)
            && BlockHelper.isWooden(worldIn, dne)
            && BlockHelper.isWooden(worldIn, dse))) {
          isBuilding = false;
          break assess;
        }
        unw = une.west();
        usw = use.west();
        dnw = dne.west();
        dsw = dse.west();
        if ((BlockHelper.isWooden(worldIn, unw)
            && BlockHelper.isWooden(worldIn, usw)
            && BlockHelper.isWooden(worldIn, dnw)
            && BlockHelper.isWooden(worldIn, dsw))) {
          isBuilding = false;
          break assess;
        }
        // First we check the Ceiling and Floor
        // First, we check Ceiling and Floor
        while (!BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)) {
          if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, use))) {
            isBuilding = false;
            break assess;
          }
          une = une.up();
          unw = unw.up();
          use = use.up();
          usw = usw.up();
        }
        while (!BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)) {
          if (!(BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dse))) {
            isBuilding = false;
            break assess;
          }
          dne = dne.down();
          dnw = dnw.down();
          dse = dse.down();
          dsw = dsw.down();
        }
        // Next we are gonna check the North and South Walls
        while (!BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)) {
          if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, dne))) {
            isBuilding = false;
            break assess;
          }
          une = une.north();
          unw = unw.north();
          dne = dne.north();
          dnw = dnw.north();
        }
        while (!BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)) {
          if (!(BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, dse))) {
            isBuilding = false;
            break assess;
          }
          use = use.south();
          usw = usw.south();
          dse = dse.south();
          dsw = dsw.south();
        }
        // Finally, we move West!
        while (!BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw)) {
          if (!(BlockHelper.isWooden(worldIn, unw)
              && BlockHelper.isWooden(worldIn, usw)
              && BlockHelper.isWooden(worldIn, dnw)
              && BlockHelper.isWooden(worldIn, dsw))) {
            isBuilding = false;
            break assess;
          }
          unw = unw.west();
          usw = usw.west();
          dnw = dnw.west();
          dsw = dsw.west();
        }
        if ((BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)
            && BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)
            && BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)
            && BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)
            && BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)
            && BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw))) {
          isBuilding = true;
          break assess;
        }
        isBuilding = false;
        break assess;
      case 5: // assume nsWall (East Facing Wall - Western wall of room)
        unw = pos.up().north();
        usw = pos.up().south();
        dnw = pos.down().north();
        dsw = pos.down().south();
        if (!(BlockHelper.isWooden(worldIn, unw)
            && BlockHelper.isWooden(worldIn, usw)
            && BlockHelper.isWooden(worldIn, dnw)
            && BlockHelper.isWooden(worldIn, dsw))) {
          isBuilding = false;
          break assess;
        }
        une = unw.east();
        use = usw.east();
        dne = dnw.east();
        dse = dsw.east();
        if ((BlockHelper.isWooden(worldIn, une)
            && BlockHelper.isWooden(worldIn, use)
            && BlockHelper.isWooden(worldIn, dne)
            && BlockHelper.isWooden(worldIn, dse))) {
          isBuilding = false;
          break assess;
        }
        // First we check the Ceiling and Floor
        // First, we check Ceiling and Floor
        while (!BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)) {
          if (!(BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, usw))) {
            isBuilding = false;
            break assess;
          }
          une = une.up();
          unw = unw.up();
          use = use.up();
          usw = usw.up();
        }
        while (!BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)) {
          if (!(BlockHelper.isWooden(worldIn, dnw) && BlockHelper.isWooden(worldIn, dsw))) {
            isBuilding = false;
            break assess;
          }
          dne = dne.down();
          dnw = dnw.down();
          dse = dse.down();
          dsw = dsw.down();
        }
        // Next we are gonna check the North and South Walls
        while (!BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)) {
          if (!(BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, dnw))) {
            isBuilding = false;
            break assess;
          }
          une = une.north();
          unw = unw.north();
          dne = dne.north();
          dnw = dnw.north();
        }
        while (!BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)) {
          if (!(BlockHelper.isWooden(worldIn, usw) && BlockHelper.isWooden(worldIn, dsw))) {
            isBuilding = false;
            break assess;
          }
          use = use.south();
          usw = usw.south();
          dse = dse.south();
          dsw = dsw.south();
        }
        // Finally, we move East!
        while (!BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)) {
          if (!(BlockHelper.isWooden(worldIn, une)
              && BlockHelper.isWooden(worldIn, use)
              && BlockHelper.isWooden(worldIn, dne)
              && BlockHelper.isWooden(worldIn, dse))) {
            isBuilding = false;
            break assess;
          }
          une = une.east();
          use = use.east();
          dne = dne.east();
          dse = dse.east();
        }
        if ((BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)
            && BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)
            && BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)
            && BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)
            && BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)
            && BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw))) {
          isBuilding = true;
          break assess;
        }
        isBuilding = false;
        break assess;
    }
    NPCHouse house = new NPCHouse(unw, une, usw, use, dnw, dne, dsw, dse, isBuilding);
    return house;
  }