/home/caleb/ASDV-Java/Semester 2/Assignments/MP1_CalebFontenot/src/main/java/com/calebfontenot/mp1_calebfontenot/MP1_CalebFontenot.java
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 */
package com.calebfontenot.mp1_calebfontenot;

import java.util.Scanner;

/**
 *
 * @author caleb
 */
public class MP1_CalebFontenot {

    public static int[][] inputArray() {
        int m, n, i, j;
        // Create scanner
        Scanner input = new Scanner(System.in);
        System.out.print("Enter the number of rows: ");
        //taking row as input  
        m = input.nextInt();
        System.out.print("Enter the number of columns: ");
        //taking column as input  
        n = input.nextInt();
        // Declaring the two-dimensional matrix   
        int returnArray[][] = new int[m][n];
        // Read the matrix values   
        System.out.println("Enter the elements of the array: ");
        //loop for row  
        for (i = 0; i < m; i++) //inner for loop for column  
        {
            for (j = 0; j < n; j++) {
                returnArray[i][j] = input.nextInt();
            }
        }
        //accessing array elements   
        System.out.println("Elements of the array are: ");
        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
                return returnArray;
            }
        }
        return null;
    }

    public static boolean isConsecutiveFour(int[] values) {
        for (int i = 0; i < values.length - 4; ++i) {
            if (values[i] == values[i + 1]
                    && values[i + 1] == values[i + 2]
                    && values[i + 2] == values[i + 3]) {
                return true;
            } else {
                return false;
            }
        }
        return false;
    }

    public static void main(String[] args) { //2965
        int[][] horizontalTestArray = { // Horizontal
            {0, 1, 0, 3, 1, 6, 1},
            {0, 1, 6, 8, 6, 0, 1},
            {5, 6, 2, 1, 8, 2, 9},
            {6, 5, 6, 1, 1, 9, 1},
            {1, 3, 6, 1, 4, 0, 7},
            {3, 3, 3, 3, 4, 0, 7}
        };

        int[][] verticalTestArray = { // Vertical
            {0, 1, 0, 3, 1, 6, 1},
            {0, 1, 6, 8, 6, 0, 1},
            {5, 5, 2, 1, 8, 2, 9},
            {6, 5, 6, 1, 1, 9, 1},
            {1, 5, 6, 1, 4, 0, 7},
            {3, 5, 3, 3, 4, 0, 7}
        };
        int[][] diagonalTestArray1 = { // Diagonal 1
            {0, 1, 0, 3, 1, 6, 1},
            {0, 1, 6, 8, 6, 0, 1},
            {9, 6, 2, 1, 8, 2, 9},
            {6, 9, 6, 1, 1, 9, 1},
            {1, 3, 9, 1, 4, 0, 7},
            {3, 3, 3, 9, 4, 0, 7}
        };
        int[][] diagonalTestArray2 = { // Diagonal 2
            {0, 1, 0, 3, 1, 6, 1},
            {0, 1, 6, 8, 6, 0, 1},
            {9, 6, 2, 1, 8, 2, 9},
            {6, 9, 6, 1, 1, 9, 1},
            {1, 3, 9, 1, 4, 0, 7},
            {3, 3, 3, 9, 4, 0, 7}
        };

        // Create scanner
        Scanner input = new Scanner(System.in);
        int userInput;
        do {
            System.out.println("Do you want to enter an array, or use a predefined one?");
            System.out.println("1. Use predefined array.");
            System.out.println("2. Enter a new array.");
            System.out.println("-1. quit and exit program");
            System.out.print("Input: ");
            userInput = input.nextInt();
            if (userInput == 1) {
                System.out.println("Selected \"Use predefined array\"");
                System.out.println("Printing arrays...");
                System.out.println("1. horizontalTestArray");
                printArray(horizontalTestArray);
                System.out.println("2. verticalTestArray");
                printArray(verticalTestArray);
                System.out.println("3. diagonalTestArray1");
                printArray(diagonalTestArray1);
                System.out.println("4. diagonalTestArray2");
                printArray(diagonalTestArray2);
                System.out.print("Input: ");
                userInput = input.nextInt();
                if (userInput == 1) {
                    if (isConsecutiveFour(horizontalTestArray)) {
                        System.out.println("Testing method returns true");
                    } else {
                        System.out.println("Testing method returns false");
                    }
                }
                if (userInput == 2) {
                    if (isConsecutiveFour(verticalTestArray)) {
                        System.out.println("Testing method returns true");
                    } else {
                        System.out.println("Testing method returns false");
                    }
                }
                if (userInput == 3) {
                    if (isConsecutiveFour(diagonalTestArray1)) {
                        System.out.println("Testing method returns true");
                    } else {
                        System.out.println("Testing method returns false");
                    }
                }
                if (userInput == 4) {
                    if (isConsecutiveFour(diagonalTestArray2)) {
                        System.out.println("Testing method returns true");
                    } else {
                        System.out.println("Testing method returns false");
                    }
                }
                userInput = 0;
            }
            if (userInput == 2) {
                System.out.println("Selected \"Enter new array\"");
                int[][] newArray = inputArray();
                if (isConsecutiveFour(newArray)) {
                    System.out.println("Testing method returns true");
                } else {
                    System.out.println("Testing method returns false");
                }
            }
        } while (userInput != -1);
        System.exit(0);
        //printArray(intArray1);
        //System.out.println(isConsecutiveFour(intArray1));
    }

    public static void printArray(int[][] array) {
        int rowCounter = 0;
        for (int x = 0; x < array.length; x++) {
            for (int y = 0; y < array[x].length; y++) {
                System.out.print(array[x][y] + " ");
                rowCounter++;
                if (rowCounter % (array.length + 1) == 0) {
                    System.out.println();
                }
            }
        }
    }

    public static void printArray(int[] array) {
        for (int i : array) {
            System.out.print(i + " ");
        }
    }

    public static boolean isConsecutiveFour(int[][] values) {
        // Horizontal Checking
        System.out.println("Checking for Horizontal matches...");
        boolean horizontalTest = horizontalMatch(values);
        // Vertical Checking
        System.out.println("Checking for Vertical matches...");
        boolean verticalTest = verticalMatch(values);
        System.out.println("Checking for Diagonal matches...");
        boolean diagonalTest = diagonalMatch(values);
        if (horizontalTest || verticalTest || diagonalTest) {
            System.out.println("Match found!");
            return true;
        }
        System.out.println("No match found.");
        return false;
    }

    public static boolean diagonalMatch(int[][] array) {
        for (int row = 0; row < array.length - 3; row++) {
            for (int col = 0; col < array[row].length - 3; col++) {
                // Check for four consecutive numbers diagonally from top-left to bottom-right
                if (array[row][col] == array[row + 1][col + 1] && array[row + 1][col + 1] == array[row + 2][col + 2]
                        && array[row + 2][col + 2] == array[row + 3][col + 3]) {
                    System.out.println("Found four consecutive numbers diagonally at: " + row + "," + col);
                    return true;
                }
                // Check for four consecutive numbers diagonally from top-right to bottom-left
                if (array[row][col + 3] == array[row + 1][col + 2] && array[row + 1][col + 2] == array[row + 2][col + 1]
                        && array[row + 2][col + 1] == array[row + 3][col]) {
                    System.out.println("Found four consecutive numbers diagonally at: " + row + "," + (col + 3));
                    return true;
                }
            }
        }
        return false;
    }

    public static boolean verticalMatch(int[][] values) {
        int intCounter = 0, y = 0;
        for (int rowIterate = 0; rowIterate < values.length; ++rowIterate) {
            y = 0;
            for (int x = 0; x < values.length - 1; ++x) {
                ++y;
                if (values[x][rowIterate] == values[y][rowIterate]) {
                    intCounter++;
                    System.out.println(values[x][rowIterate] + " " + values[y][rowIterate] + ",  intCounter: " + intCounter);
                } else {
                    intCounter = 0;
                    System.out.println(values[x][rowIterate] + " " + values[y][rowIterate] + ",  intCounter: " + intCounter);
                }
                if (intCounter == 3) {
                    System.out.println("Vertical match!");
                    return true;
                }
            }
            System.out.println("Checking next line...");
        }
        return false;
    }

    public static boolean horizontalMatch(int[][] values) {
        int intCounter = 0, y = 0;
        // Horizontal checking
        // If the same value has been observed 4 times, return true
        //System.out.println("values[0].length: " + values[0].length);
        //System.out.println("values.length: " + values.length);

        for (int rowIterate = 0; rowIterate < values.length; ++rowIterate) {
            y = 0;
            for (int x = 0; x < values[0].length - 1; ++x) {
                ++y;
                if (values[rowIterate][x] == values[rowIterate][y]) {
                    intCounter++;
                    System.out.println(values[rowIterate][x] + " " + values[rowIterate][y] + ",  intCounter: " + intCounter);
                } else {
                    intCounter = 0;
                    System.out.println(values[rowIterate][x] + " " + values[rowIterate][y] + ",  intCounter: " + intCounter);
                }
                if (intCounter == 3) {
                    System.out.println("Horizontal match!");
                    return true;
                }
            }
            System.out.println("Checking next line...");
        }
        return false;
    }
}