package org.kylin.algorithm.pattern;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.kylin.constant.BitConstant;

import java.util.List;
import java.util.Optional;

@AllArgsConstructor
public enum BitSeqEnum {
    ABC(1, "abc"){
        @Override
        public boolean seqEqual(Integer[] target) {
            if(ArrayUtils.getLength(target) < 3){
                return false;
            }
            return target[BitConstant.UNIT] > target[BitConstant.DECADE]
                    ? (target[BitConstant.DECADE] > target[BitConstant.HUNDRED]) : false;
        }

        @Override
        public boolean seqEqual(List<Integer> target) {
            if(CollectionUtils.size(target) < 3){
                return false;
            }
            return target.get(0)<target.get(1) ? (target.get(1) < target.get(2)) : false;
        }
    },

    ACB(2, "acb"){
        @Override
        public boolean seqEqual(Integer[] target) {
            if(ArrayUtils.getLength(target) < 3){
                return false;
            }
            return target[BitConstant.DECADE] > target[BitConstant.UNIT]
                    ? (target[BitConstant.UNIT] > target[BitConstant.HUNDRED]) : false;
        }

        @Override
        public boolean seqEqual(List<Integer> target) {
            if(CollectionUtils.size(target) < 3){
                return false;
            }
            return target.get(0)<target.get(2) ? (target.get(2) < target.get(1)) : false;
        }
    },
    BAC(3, "bac"){
        @Override
        public boolean seqEqual(Integer[] target) {
            if(ArrayUtils.getLength(target) < 3){
                return false;
            }
            return target[BitConstant.UNIT] > target[BitConstant.HUNDRED]
                    ? (target[BitConstant.HUNDRED] > target[BitConstant.DECADE]) : false;
        }

        @Override
        public boolean seqEqual(List<Integer> target) {
            if(CollectionUtils.size(target) < 3){
                return false;
            }
            return target.get(1)<target.get(0) ? (target.get(0) < target.get(2)) : false;
        }
    },
    BCA(4, "bca"){
        @Override
        public boolean seqEqual(Integer[] target) {
            if(ArrayUtils.getLength(target) < 3){
                return false;
            }
            return target[BitConstant.DECADE] > target[BitConstant.HUNDRED] ? (target[BitConstant.HUNDRED] > target[BitConstant.UNIT]) : false;
        }

        @Override
        public boolean seqEqual(List<Integer> target) {
            if(CollectionUtils.size(target) < 3){
                return false;
            }
            return target.get(1)>target.get(0) ? (target.get(0) < target.get(2)) : false;
        }
    },
    CAB(5, "cab"){
        @Override
        public boolean seqEqual(Integer[] target) {
            if(ArrayUtils.getLength(target) < 3){
                return false;
            }
            return target[BitConstant.HUNDRED] > target[BitConstant.UNIT]
                    ? (target[BitConstant.UNIT] > target[BitConstant.DECADE]) : false;
        }

        @Override
        public boolean seqEqual(List<Integer> target) {
            if(CollectionUtils.size(target) < 3){
                return false;
            }
            return target.get(0)>target.get(2) ? (target.get(2) < target.get(1)) : false;
        }
    },
    CBA(6, "cba"){
        @Override
        public boolean seqEqual(Integer[] target) {
            if(ArrayUtils.getLength(target) < 3){
                return false;
            }
            return target[BitConstant.HUNDRED] > target[BitConstant.DECADE] ?
                    (target[BitConstant.DECADE] > target[BitConstant.UNIT]) : false;
        }

        @Override
        public boolean seqEqual(List<Integer> target) {
            if(CollectionUtils.size(target) < 3){
                return false;
            }
            return target.get(2)<target.get(1) ? (target.get(1) < target.get(0)) : false;
        }
    },
    ;


    @Getter
    private int id;
    @Getter
    private String desc;
    public abstract boolean seqEqual(Integer[] target);
    public abstract boolean seqEqual(List<Integer> target);


    public static Optional<BitSeqEnum> getById(int id){
        for(BitSeqEnum seqEnum : BitSeqEnum.values()){
            if(seqEnum.getId() == id){
                return Optional.of(seqEnum);
            }
        }
        return Optional.empty();
    }

}

@@ -870,35 +870,35 @@
 turn target.get(
-0)%3C
+2)%3E
 target.get(1) ? 
@@ -904,33 +904,33 @@
  (target.get(1) 
-%3C
+%3E
  target.get(2)) 
@@ -917,33 +917,33 @@
 1) %3E target.get(
-2
+0
 )) : false;%0A    
@@ -1513,11 +1513,11 @@
 get(
-0)%3C
+1)%3E
 targ
@@ -1535,33 +1535,33 @@
  (target.get(2) 
-%3C
+%3E
  target.get(1)) 
@@ -1548,33 +1548,33 @@
 2) %3E target.get(
-1
+0
 )) : false;%0A    
@@ -2146,11 +2146,11 @@
 get(
-1)%3C
+2)%3E
 targ
@@ -2168,33 +2168,33 @@
  (target.get(0) 
-%3C
+%3E
  target.get(2)) 
@@ -2181,33 +2181,33 @@
 0) %3E target.get(
-2
+1
 )) : false;%0A    
@@ -2789,17 +2789,17 @@
 .get(0) 
-%3C
+%3E
  target.
@@ -3419,17 +3419,17 @@
 .get(2) 
-%3C
+%3E
  target.
@@ -4021,11 +4021,11 @@
 get(
-2)%3C
+0)%3E
 targ
@@ -4051,17 +4051,17 @@
 .get(1) 
-%3C
+%3E
  target.
@@ -4056,33 +4056,33 @@
 1) %3E target.get(
-0
+2
 )) : false;%0A    

fix & refactor