package sk.upjs.umv;
import java.util.List;
public class Zlomok implements Comparable<Zlomok> {
        public static final Zlomok JENDA_POLOVICA = new Zlomok(1, 2);
        private long citatel;
        private long menovatel;
        public Zlomok(long citatel, long menovatel) {
                this.citatel = citatel;
                this.menovatel = menovatel;
                normalizuj();
        }
        @Override
        public int hashCode() {
                final int prime = 31;
                int result = 1;
                result = prime * result + (int) (citatel ^ (citatel >>> 32));
                result = prime * result + (int) (menovatel ^ (menovatel >>> 32));
                return result;
        }
        @Override
        public boolean equals(Object obj) {
                if (this == obj)
                        return true;
                if (obj == null)
                        return false;
                if (getClass() != obj.getClass())
                        return false;
                Zlomok other = (Zlomok) obj;
                if (citatel != other.citatel)
                        return false;
                if (menovatel != other.menovatel)
                        return false;
                return true;
        }
        public static Zlomok sucet(List<Zlomok> zlomky) {
                Zlomok vysledok = new Zlomok(1, 1);
                for (Zlomok z : zlomky) {
                        long spolocnyMenovatel = vysledok.menovatel * z.menovatel;
                        long citatel = vysledok.citatel * z.menovatel + z.citatel * vysledok.menovatel;
                        vysledok.citatel = citatel;
                        vysledok.menovatel = spolocnyMenovatel;
                        vysledok.normalizuj();
                }
                // odcitam jednotku, ktoru som mal na zaciatku
                vysledok.citatel -= vysledok.menovatel;
                vysledok.normalizuj();
                return vysledok;
        }
        public long getCitatel() {
                return citatel;
        }
        public long getMenovatel() {
                return menovatel;
        }
        private void normalizuj() {
                long gcd = gcd(citatel, menovatel);
                if (gcd == 0)
                        gcd = 1;
                citatel /= gcd;
                menovatel /= gcd;
        }
        private long gcd(long a, long b) {
                if (a == 0)
                        return b;
                while (b != 0)
                        if (a > b)
                                a = a - b;
                        else
                                b = b - a;
                return a;
        }
        @Override
        public String toString() {
                return citatel + "/" + menovatel;
        }
        @Override
        public int compareTo(Zlomok z) {
                return Long.compare(citatel * z.menovatel, z.citatel * menovatel);
        }
}