import { MonthDeltio } from '../../../../models/HrSupport/PersonalFolder';
import { SkonakiData } from '../../../UI/Templates/SidebarSkonakiAena';
import dayjs from 'dayjs';
import {InitedAvailabYearsData, InitedAvailabYearsProjectsData} from "./AenaHeader";

// ─── Types ────────────────────────────────────────────────────────────────────
export interface YearOption {
    value: string | number;
    name: string;
}

// ─── Constants ────────────────────────────────────────────────────────────────
export const MONTHS_GR = [
    'ΙΑΝΟΥΑΡΙΟΣ', 'ΦΕΒΡΟΥΑΡΙΟΣ', 'ΜΑΡΤΙΟΣ',    'ΑΠΡΙΛΙΟΣ',
    'ΜΑΪΟΣ',      'ΙΟΥΝΙΟΣ',     'ΙΟΥΛΙΟΣ',     'ΑΥΓΟΥΣΤΟΣ',
    'ΣΕΠΤΕΜΒΡΙΟΣ','ΟΚΤΩΒΡΙΟΣ',   'ΝΟΕΜΒΡΙΟΣ',   'ΔΕΚΕΜΒΡΙΟΣ',
];

export const ALLOWED_PDF_EXTENSIONS = '.pdf,.PDF,application/pdf';
export const MAX_FILE_SIZE_BYTES    = 41943040; // 40 MB

// ─── Helpers ──────────────────────────────────────────────────────────────────

export const getBaseUrl = (): string => {
    const host = window.location.hostname;

    if (host === 'panel.egov.demokritos.gr' || host === 'dua.egov.demokritos.gr')
        return 'https://panel.egov.demokritos.gr';

    if (host === 'panel.egov-demo.demokritos-dev.eu' || host === 'dua.egov-demo.demokritos-dev.eu')
        return 'http://panel.egov-demo.demokritos-dev.eu';

    if (host === 'panel.egov.demokritos-dev.eu' || host === 'dua.egov.demokritos-dev.eu')
        return 'http://panel.egov.demokritos-dev.eu';

    return 'http://panel.local.egov.demokritos.gr';
};

/** Returns the most recent updatedAt label across all deltia that have a file. */
export const getLatestUpdateLabel = (deltia: MonthDeltio[]): string => {
    const latest = deltia
        .filter(m => m.updatedAt && m.file)
        .sort((a, b) => new Date(b.updatedAt!).getTime() - new Date(a.updatedAt!).getTime())[0];

    if (!latest) return '-';

    const date = dayjs(latest.updatedAt).format('DD-MM-YYYY HH:mm');
    return `${latest.updatedBy} ${date}`;
};

/** Maps a raw API a1_pdf_files item to MonthDeltio. */
export const mapToMonthDeltio = (item: any): MonthDeltio => ({
    monthI:    item.month_id,
    month:     MONTHS_GR[item.month_id - 1],
    file:      item.file,
    file_uuid: item.file_id,
    isLocked:  Boolean(item.locked),
    projects:  item.project_codes ? [item.project_codes] : [],
    updatedBy: item.file?.uploader_user_full_name ?? '',
    updatedAt: item.updated_at,
    temp_url:  item.file?.temp_url ?? null,
    locked:    Boolean(item.locked),
});

/** Maps a raw API skonaki item to SkonakiData. */
export const mapSkonakiItem = (item: any): SkonakiData => ({
    projectCode:     item.project_code,
    projectTitle:    item.project_a1_title,
    projectCategory: item.project_a1_category,
    scientificLead:  item.scientific_supervisor_fullname,
    contractStart:   dayjs(item.contract_start_date).format('DD.MM.YYYY'),
    contractEnd:     dayjs(item.contract_end_date).format('DD.MM.YYYY'),
    durationMonths:  Number(item.contract_duration),
    totalFee:        item.contract_cost,
    hours:           item.extra?.work_hours ?? 0,
    hourlyRate:      item.hourly_rate,
    workPackages:    (item.work_packages ?? []).map((wp: any) => ({
        id:        wp.id,
        title:     wp.title,
        from_date: wp.from_date,
        to_date:   wp.to_date,
    })),
});

export const mapInitedAvailabYearsProject = (project: any): InitedAvailabYearsProjectsData => ({
    project_code: project.project_code,
    is_mine: project.is_mine,
});

export const mapinitdAvailabYearsItem = (item: any): InitedAvailabYearsData => ({
    year: item.year,
    exists: item.exists,
    project_codes: (item.project_codes ?? []).map(mapInitedAvailabYearsProject),
});

/** Formats a Date to dd-MM-yyyy HH:mm */
export const formatDate = (value: string | Date): string => {
    const d = new Date(value);
    const pad = (n: number) => String(n).padStart(2, '0');
    return `${pad(d.getDate())}-${pad(d.getMonth() + 1)}-${d.getFullYear()} ${pad(d.getHours())}:${pad(d.getMinutes())}`;
};
