Problem with millis() timing

ok, so over the last one week i had time to experience with millis(), and i managed to get more things working at the same time independently, which is good, but the code started to get complicated. So the internet pointed to state machines.
I wrote a code using switch case. the problem is, i am trying to do different things with the same switch based on how long the switch is pressed. I have an if statement in case 3, where only the first part of the if statement counts for some reason? As soon as the button pressed time reaches the first part, it jumps to case 4. What am i missing here?

const int button = 3;
const int led = 8;
const int led2 = 9;

int buttonState = 0;
int lastButtonState = 0;
int switch_1 = 0;
int last_switch_1 = 0;          

unsigned long startMillis;
unsigned long debounce = 50;
unsigned long longPeriod = 1000;
unsigned long currentMillis;
unsigned long diff = 0;

boolean led2On = false;
boolean ledOn = false;


void setup() {

   Serial.begin(115200);
   pinMode(button, INPUT_PULLUP);
   pinMode(led, OUTPUT);
   pinMode(led2, OUTPUT);
}

void loop() {
 
stateMachine();

  if(switch_1 != last_switch_1){
    Serial.println(switch_1);
    Serial.println(diff);
  }
  if(switch_1 == 4){
    Serial.println("Debounce Over!");
 }
  if(switch_1 == 6){
    Serial.println("LONG");
  }
}

void stateMachine(){
 lastButtonState = buttonState;
 last_switch_1 = switch_1;
 buttonState = digitalRead(button);
   
    switch(switch_1){
    
    case 0:
    switch_1 = 1;
    break;

    case 1:
    if(buttonState != lastButtonState){       
    if(buttonState == LOW){
      switch_1 = 2;
    }
    }
    break;

    case 2:
    startMillis = millis();
    switch_1 = 3;
    break;

    case 3:
    currentMillis = millis();
    if(buttonState == HIGH){
     switch_1 = 0;
    }
    diff = currentMillis - startMillis;
    if((diff > debounce) && (diff < longPeriod)){
      switch_1 = 4;
    }
    break;

    case 4:
    if(diff > longPeriod){
      switch_1 = 6;
    }
    else{
    switch_1 = 0;
    }
    break;

    case 5:
    switch_1 = 4;
    break;

    case 6:
    switch_1 = 0;
    break;
   
    }
}   

in serial monitor you can see the time the button pressed, and counting stops at the given debounce number even though the button is kept pressed