#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Employee {
    int MNV;
    char HT[50];
    double LUONG;
    char PHONG[10];
};

// Hàm để đọc danh sách nhân viên từ tệp
struct Employee* readEmployeeListFromFile(const char* filename, int* numEmployees) {
    FILE* file = fopen(filename, "r");
    if (file == NULL) {
        printf("Không thể mở tệp %s\n", filename);
        return NULL;
    }

    fscanf(file, "%d", numEmployees);

    struct Employee* employees = (struct Employee*)malloc(*numEmployees * sizeof(struct Employee));

    for (int i = 0; i < *numEmployees; i++) {
        fscanf(file, "%d %s %lf %s", &employees[i].MNV, employees[i].HT, &employees[i].LUONG, employees[i].PHONG);
    }

    fclose(file);
    return employees;
}

// Hàm để tính lương trung bình của từng phòng và tìm phòng có lương trung bình cao nhất
void calculateAverageSalary(struct Employee* employees, int numEmployees) {
    double totalSalaryA = 0, totalSalaryB = 0, totalSalaryC = 0;
    int countA = 0, countB = 0, countC = 0;

    for (int i = 0; i < numEmployees; i++) {
        if (strcmp(employees[i].PHONG, "A") == 0) {
            totalSalaryA += employees[i].LUONG;
            countA++;
        } else if (strcmp(employees[i].PHONG, "B") == 0) {
            totalSalaryB += employees[i].LUONG;
            countB++;
        } else if (strcmp(employees[i].PHONG, "C") == 0) {
            totalSalaryC += employees[i].LUONG;
            countC++;
        }
    }

    double avgSalaryA = (countA > 0) ? totalSalaryA / countA : 0;
    double avgSalaryB = (countB > 0) ? totalSalaryB / countB : 0;
    double avgSalaryC = (countC > 0) ? totalSalaryC / countC : 0;

    printf("Lương trung bình của phòng A: %.2lf\n", avgSalaryA);
    printf("Lương trung bình của phòng B: %.2lf\n", avgSalaryB);
    printf("Lương trung bình của phòng C: %.2lf\n", avgSalaryC);

    if (avgSalaryA > avgSalaryB && avgSalaryA > avgSalaryC) {
        printf("Phòng A có lương trung bình cao nhất\n");
    } else if (avgSalaryB > avgSalaryA && avgSalaryB > avgSalaryC) {
        printf("Phòng B có lương trung bình cao nhất\n");
    } else if (avgSalaryC > avgSalaryA && avgSalaryC > avgSalaryB) {
        printf("Phòng C có lương trung bình cao nhất\n");
    } else {
        printf("Có nhiều phòng có lương trung bình cao nhất\n");
    }
}

// Hàm để in danh sách nhân viên theo thứ tự tăng dần của lương
void printEmployeeList(struct Employee* employees, int numEmployees) {
    // Sắp xếp danh sách nhân viên theo thứ tự tăng dần của lương
    for (int i = 0; i < numEmployees - 1; i++) {
        for (int j = 0; j < numEmployees - i - 1; j++) {
            if (employees[j].LUONG > employees[j + 1].LUONG) {
                struct Employee temp = employees[j];
                employees[j] = employees[j + 1];
                employees[j + 1] = temp;
            }
        }
    }

    // In danh sách nhân viên
    printf("Danh sách nhân viên:\n");
    for (int i = 0; i < numEmployees; i++) {
        printf("MNV: %d, HT: %s, Lương: %.2lf, Phòng: %s\n", employees[i].MNV, employees[i].HT, employees[i].LUONG, employees[i].PHONG);
    }
}

// Hàm để ghi kết quả vào tệp
void writeResultToFile(struct Employee* employees, int numEmployees, const char* filename) {
    FILE* file = fopen(filename, "w");
    if (file == NULL) {
        printf("Không thể mở tệp %s\n", filename);
        return;
    }

    fprintf(file, "%d\n", numEmployees);
    for (int i = 0; i < numEmployees; i++) {
        fprintf(file, "%d %s %.2lf %s\n", employees[i].MNV, employees[i].HT, employees[i].LUONG, employees[i].PHONG);
    }

    fclose(file);
}

int main() {
    // Đọc danh sách nhân viên từ tệp
    int numEmployees;
    struct Employee* employees = readEmployeeListFromFile("input.txt", &numEmployees);
    if (employees == NULL) {
        return 0;
    }

    // Tính lương trung bình của từng phòng và phòng có lương trung bình cao nhất
    calculateAverageSalary(employees, numEmployees);

    // In danh sách nhân viên theo thứ tự tăng dần của lương
    printEmployeeList(employees, numEmployees);

    // Ghi kết quả vào tệp
    writeResultToFile(employees, numEmployees, "output.txt");

    // Giải phóng bộ nhớ đã cấp phát cho danh sách nhân viên
    free(employees);

    return 0;
}