package capitulo04.bloque06;

import static capitulo04.utils.Utils.*;

public class Matrices {
    public static void main(String[] args) {
        int[][] matrizVacia = new int[5][5];
        mostrarMatriz(rellenarMatriz(matrizVacia));

        int[][] matrizRellena = new int[][]{
                {0, 6, 7, 2, 3},
                {2, 0, 7, 8, 3},
                {2, 6, 0, 6, 3},
                {2, 6, 7, 0, 3},
                {2, 6, 7, 1, 0}};

        System.out.println(matrizEsPositiva(matrizRellena));
        System.out.println(matrizEsDiagonal(matrizRellena));
        System.out.println(matrizEsTriangularSuperior(matrizRellena));
        System.out.println(matrizEsDispersa(matrizRellena));
        mostrarArrayNums(construirArrayDeMatriz(matrizRellena));
        System.out.println(matrizEsSimetrica(matrizRellena));
        mostrarMatriz(matrizTraspuesta(matrizRellena));
        mostrarMatriz(matrizOpuesta(matrizRellena));
        mostrarMatriz(matrizSinFila(matrizRellena, solicitarIntScanner("Introduzca la fila a eliminar de la matriz: ")));

    }

    public static int[][] rellenarMatriz(int[][] matriz) {
        for (int i = 0; i < matriz.length; i++) {
            for (int j = 0; j < matriz[i].length; j++) {
                matriz[i][j] = (int) generarNumAleatorio(100);
            }
        }
        return matriz;
    }

    public static void mostrarMatriz(int[][] matriz) {
        for (int i = 0; i < matriz.length; i++) {
            for (int j = 0; j < matriz[i].length; j++) {
                System.out.print(matriz[i][j] + "\t");
            }
            System.out.println();
        }
    }

    public static boolean matrizEsPositiva(int[][] matriz) {
        for (int i = 0; i < matriz.length; i++) {
            for (int j = 0; j < matriz[i].length; j++) {
                if (matriz[i][j] < 0) {
                    return false;
                }
            }
        }
        return true;
    }

    public static boolean matrizEsDiagonal(int[][] matriz) {
        for (int i = 0; i < matriz.length; i++) {
            for (int j = 0; j < matriz[i].length; j++) {
                if (i != j && matriz[i][j] != 0) {
                    return false;
                }
            }
        }
        return true;
    }

    public static boolean matrizEsTriangularSuperior(int[][] matriz) {
        for (int i = 0; i < matriz.length; i++) {
            for (int j = 0; j < matriz[i].length; j++) {
                if (i > j && matriz[i][j] != 0) {
                    return false;
                }
            }
        }
        return true;
    }

    public static boolean matrizEsDispersa(int[][] matriz) {
        boolean esDispersa = true;

        for (int i = 0; i < matriz.length; i++) {
            boolean filaTieneCero = false;
            for (int j = 0; j < matriz[i].length; j++) {
                if (matriz[i][j] == 0) {
                    filaTieneCero = true;
                    break;
                }
            }
            if (!filaTieneCero) {
                esDispersa = false;
                break;
            }
        }

        if (esDispersa) {
            for (int j = 0; j < matriz[0].length; j++) {
                boolean columnaTieneCero = false;
                for (int i = 0; i < matriz.length; i++) {
                    if (matriz[i][j] == 0) {
                        columnaTieneCero = true;
                        break;
                    }
                }
                if (!columnaTieneCero) {
                    esDispersa = false;
                    break;
                }
            }
        }

        return esDispersa;
    }

    public static int[] construirArrayDeMatriz(int[][] matriz) {
        int elementosMatriz = 0;
        for (int i = 0; i < matriz.length; i++) {
            elementosMatriz += matriz[i].length;
        }
        int[] array = new int[elementosMatriz];
        int indiceArray = 0;
        for (int i = 0; i < matriz.length; i++) {
            for (int j = 0; j < matriz[i].length; j++) {
                array[indiceArray] = matriz[i][j];
                indiceArray++;
            }
        }
        return array;
    }

    public static boolean matrizEsSimetrica(int[][] matriz) {
        for (int i = 0; i < matriz.length; i++) {
            for (int j = 0; j < matriz[i].length; j++) {
                if (matriz[i][j] != matriz[j][i]) {
                    return false;
                }
            }
        }
        return true;
    }

    public static int[][] matrizTraspuesta(int[][] matriz) {
        int[][] matrizTraspuesta = new int[matriz[0].length][matriz.length];
        for (int i = 0; i < matriz.length; i++) {
            for (int j = 0; j < matriz[i].length; j++) {
                matrizTraspuesta[j][i] = matriz[i][j];
            }
        }
        return matrizTraspuesta;
    }

    public static int[][] matrizOpuesta(int[][] matriz) {
        int[][] matrizOpuesta = new int[matriz.length][matriz[0].length];
        for (int i = 0; i < matriz.length; i++) {
            for (int j = 0; j < matriz[i].length; j++) {
                matrizOpuesta[i][j] = -matriz[i][j];
            }
        }
        return matrizOpuesta;
    }


    public static int[][] matrizSinFila(int[][] matriz, int fila) {
        int[][] matrizSinFila = new int[matriz.length - 1][matriz[0].length];
        int indiceFila = 0;
        for (int i = 0; i < matriz.length; i++) {
            if (i != fila - 1) {
                for (int j = 0; j < matriz[i].length; j++) {
                    matrizSinFila[indiceFila][j] = matriz[i][j];
                }
                indiceFila++;
            }
        }
        return matrizSinFila;
    }
}
