package pt.utl.ist.scripts.process.updateData;

import java.util.Iterator;

import net.sourceforge.fenixedu.domain.Department;
import net.sourceforge.fenixedu.domain.Role;
import net.sourceforge.fenixedu.domain.UnitBoardPermittedGroupType;
import net.sourceforge.fenixedu.domain.accessControl.DepartmentEmployeesGroup;
import net.sourceforge.fenixedu.domain.accessControl.RoleTypeGroup;
import net.sourceforge.fenixedu.domain.messaging.AnnouncementBoard;
import net.sourceforge.fenixedu.domain.messaging.UnitAnnouncementBoard;
import net.sourceforge.fenixedu.domain.organizationalStructure.Unit;
import net.sourceforge.fenixedu.domain.person.RoleType;
import pt.ist.bennu.core.domain.Bennu;
import pt.utl.ist.fenix.tools.util.i18n.Language;
import pt.utl.ist.fenix.tools.util.i18n.MultiLanguageString;
import pt.utl.ist.scripts.commons.AtomicScript;

public class CreateDepartmentBoards extends AtomicScript {

    public static final String ANNOUNCEMENTS_NAME = "Anúncios";
    public static final String EVENTS_NAME = "Eventos";

    public static void main(String[] args) {
        processWriteTransaction(new CreateDepartmentBoards());
    }

    @Override
    protected void run() throws Exception {
        Iterator<Role> iterator = Bennu.getInstance().getRolesSet().iterator();

        for (Department department : Bennu.getInstance().getDepartmentsSet()) {
            Unit unit = department.getDepartmentUnit();

            if (unit != null) {
                if (!hasAnnouncementsBoard(unit)) {
                    createAnnouncementsBoard(department, unit);
                }

                if (!hasEventsBoard(unit)) {
                    createEventsBoard(department, unit);
                }
            }
        }

        iterator.next();
    }

    private boolean hasAnnouncementsBoard(Unit unit) {
        return hasBoard(unit, ANNOUNCEMENTS_NAME);
    }

    private boolean hasEventsBoard(Unit unit) {
        return hasBoard(unit, EVENTS_NAME);
    }

    private boolean hasBoard(Unit unit, String name) {
        for (AnnouncementBoard board : unit.getBoards()) {
            if (board.getName().equalInAnyLanguage(name)) {
                return true;
            }
        }

        return false;
    }

    private void createAnnouncementsBoard(Department department, Unit unit) {
        createBoard(department, unit, ANNOUNCEMENTS_NAME);
    }

    private void createEventsBoard(Department department, Unit unit) {
        createBoard(department, unit, EVENTS_NAME);
    }

    private void createBoard(Department department, Unit unit, String name) {
        System.out.println(String.format("Creating '%s' board for: %s", name, unit.getNameWithAcronym()));

        UnitAnnouncementBoard board = new UnitAnnouncementBoard(unit);
        board.setMandatory(false);

        board.setName(new MultiLanguageString().with(Language.pt, name));
        board.setReaders(null);
        board.setWriters(new DepartmentEmployeesGroup(department));
        board.setManagers(new RoleTypeGroup(RoleType.MANAGER));
        board.setUnitPermittedReadGroupType(UnitBoardPermittedGroupType.UB_PUBLIC);
        board.setUnitPermittedWriteGroupType(UnitBoardPermittedGroupType.UB_DEPARTMENT_EMPLOYEES);
        board.setUnitPermittedManagementGroupType(UnitBoardPermittedGroupType.UB_MANAGER);
    }

}
