#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <windows.h>

// 모스 부호를 나타내는 구조체
struct MorseCode {
    char letter;      // 알파벳
    char* code;       // 모스 부호
};

// 알파벳과 모스 부호를 저장하는 배열
struct MorseCode morseCodes[] = {
  {'A', ".-"},
  {'B', "-..."},
  {'C', "-.-."},
  {'D', "-.."},
  {'E', "."},
  {'F', "..-."},
  {'G', "--."},
  {'H', "...."},
  {'I', ".."},
  {'J', ".---"},
  {'K', "-.-"},
  {'L', ".-.."},
  {'M', "--"},
  {'N', "-."},
  {'O', "---"},
  {'P', ".--."},
  {'Q', "--.-"},
  {'R', ".-."},
  {'S', "..."},
  {'T', "-"},
  {'U', "..-"},
  {'V', "...-"},
  {'W', ".--"},
  {'X', "-..-"},
  {'Y', "-.--"},
  {'Z', "--.."}
};



// 모스 부호를 비프음으로 출력하는 함수
void playMorseCode(char* morseCode) {
    // 비프음 속도
    int dotDuration = 200;

    // 모스 부호를 반복하면서 각 문자를 비프음으로 변환하여 재생
    for (int i = 0; morseCode[i] != '\0'; i++) {
        if (morseCode[i] == '.') {
            Beep(1000, dotDuration);
        }
        else if (morseCode[i] == '-') {
            Beep(1000, 3 * dotDuration);
        }
        else {
            // Sleep(dotDuration);
        }
    }
}

// 문자열을 모스 부호로 변환하는 함수
char* encodeMessage(char* message){
    // 결과를 저장할 문자열
    char* result = malloc(strlen(message) * 10 + 1); // 메모리 할당


    // 문자열을 모스 부호로 변환
    for (int i = 0; message[i] != '\0'; i++) {

        // 대문자로 변환
        char c = toupper(message[i]);

        // 알파벳을 찾아서 모스 부호를 가져옴
        for (int j = 0; j < sizeof(morseCodes) / sizeof(morseCodes[0]); j++) {

            if (morseCodes[j].letter == c) {
                result = strcat(result, morseCodes[j].code); // 문자열 연결
                result = strcat(result, " "); // 문자열 연결
                break;

            }

        }
    }

    // 마지막에 공백 제거
    if (strlen(result) > 0 && result[strlen(result) - 1] == ' ') {
        result[strlen(result) - 1] = '\0';
    }
    printf("The Morse CODE is: %s\n\n", result);

    /*
    printf("The Mos CODE is: ");
    for (int l = 0; result[l] != '\0'; l++) {
        printf("%c", result[l]);
    }
    printf("\n\n");
    */

    return result;
}

int main(void)
{
    char str[100];
    
    printf("INPUT - uppercase alphabet -: ");
    scanf("%s", str);

    str[strcspn(str, "\n")] = '\0';
    printf("\n");
    printf("The string is: ");
    for (int i = 0; str[i] != '\0'; i++) {
        printf("%c", str[i]);
    }
    printf("\n\n");

    char* morseCode = encodeMessage(str);

    printf("\n");
    printf("The Mos CODE is: ");
    for (int l = 0; morseCode[l] != '\0'; l++) {
        printf("%c", morseCode[l]);
    }
    printf("\n\n");

    Beep(1500, 1000); // 1000 Hz, 0.5초 동안 출력
    playMorseCode(morseCode);

    
    
    //playMorseCode(".... . .-.. .-.. ---");
    //Beep(1500, 1000); // 1000 Hz, 0.5초 동안 출력

    return 0;
}