import { nip19 } from "nostr-tools";

export const findKind0Fields = async (kind0) => {
    let fields = {}

    const usernameProperties = ['name', 'displayName', 'display_name', 'username', 'handle', 'alias'];

    const pubkeyProperties = ['pubkey', 'npub', '_pubkey'];

    const findTruthyPropertyValue = (object, properties) => {
        for (const property of properties) {
            if (object?.[property]) {
                return object[property];
            }
        }
        return null;
    };

    const username = findTruthyPropertyValue(kind0, usernameProperties);

    if (username) {
        fields.username = username;
    }

    const avatar = findTruthyPropertyValue(kind0, ['picture', 'avatar', 'profilePicture', 'profile_picture', 'image']);

    if (avatar) {
        fields.avatar = avatar;
    }

    const pubkey = findTruthyPropertyValue(kind0, pubkeyProperties);

    if (pubkey) {
        fields.pubkey = pubkey;
    }

    const lud16 = findTruthyPropertyValue(kind0, ['lud16', 'lightning', 'lnurl', 'lnurlp', 'lnurlw']);

    if (lud16) {
        fields.lud16 = lud16;
    }

    return fields;
}

export const parseMessageEvent = (event) => {
    const eventData = {
        id: event.id,
        pubkey: event.pubkey || '',
        content: event.content || '',
        kind: event.kind || '',
        type: 'message',
    };

    return eventData;
}


export const parseEvent = (event) => {
    // Initialize an object to store the extracted data
    const eventData = {
        id: event.id,
        pubkey: event.pubkey || '',
        content: event.content || '',
        kind: event.kind || '',
        additionalLinks: [],
        title: '',
        summary: '',
        image: '',
        published_at: '',
        topics: [], // Added to hold all topics
        type: 'document', // Default type
    };

    // Iterate over the tags array to extract data
    event.tags.forEach(tag => {
        switch (tag[0]) { // Check the key in each key-value pair
            case 'title':
                eventData.title = tag[1];
                break;
            case 'summary':
                eventData.summary = tag[1];
                break;
            case 'description':
                eventData.summary = tag[1];
                break;
            case 'name':
                eventData.title = tag[1];
                break;
            case 'image':
                eventData.image = tag[1];
                break;
            case 'published_at':
                eventData.published_at = tag[1];
                break;
            case 'author':
                eventData.author = tag[1];
                break;
            case 'price':
                eventData.price = tag[1];
                break;
            // How do we get topics / tags?
            case 'l':
                // Grab index 1 and any subsequent elements in the array
                tag.slice(1).forEach(topic => {
                    eventData.topics.push(topic);
                });
                break;
            case 'd':
                eventData.d = tag[1];
                break;
            case 't':
                if (tag[1] === 'video') {
                    eventData.type = 'video';
                } else if (tag[1] !== "plebdevs") {
                    eventData.topics.push(tag[1]);
                }
                break;
            case 'r':
                eventData.additionalLinks.push(tag[1]);
                break;
            default:
                break;
        }
    });

    // if published_at is an empty string, then set it to event.created_at
    if (!eventData.published_at) {
        eventData.published_at = event.created_at;
    }

    return eventData;
};

export const parseCourseEvent = (event) => {
    // Initialize an object to store the extracted data
    const eventData = {
        id: event.id,
        pubkey: event.pubkey || '',
        content: event.content || '',
        kind: event.kind || '',
        name: '',
        description: '',
        image: '',
        published_at: '',
        created_at: event.created_at,
        topics: [],
        d: '',
        tags: event.tags,
        type: 'course',
    };

    // Iterate over the tags array to extract data
    event.tags.forEach(tag => {
        switch (tag[0]) { // Check the key in each key-value pair
            case 'name':
                eventData.name = tag[1];
                break;
            case 'description':
                eventData.description = tag[1];
                break;
            case 'image':
                eventData.image = tag[1];
                break;
            case 'picture':
                eventData.image = tag[1];
                break;
            case 'published_at':
                eventData.published_at = tag[1];
                break;
            case 'd':
                eventData.d = tag[1];
                break;
            case 'price':
                eventData.price = tag[1];
                break;
            // How do we get topics / tags?
            case 'l':
                // Grab index 1 and any subsequent elements in the array
                tag.slice(1).forEach(topic => {
                    eventData.topics.push(topic);
                });
                break;
            case 'r':
                eventData.additionalLinks.push(tag[1]);
                break;
            default:
                break;
        }
    });

    return eventData;
}

export const hexToNpub = (hex) => {
    return nip19.npubEncode(hex);
}

export function validateEvent(event) {
    if (typeof event.kind !== "number") return "Invalid kind";
    if (typeof event.content !== "string") return "Invalid content";
    if (typeof event.created_at !== "number") return "Invalid created_at";
    if (typeof event.pubkey !== "string") return "Invalid pubkey";
    if (!event.pubkey.match(/^[a-f0-9]{64}$/)) return "Invalid pubkey format";

    if (!Array.isArray(event.tags)) return "Invalid tags";
    for (let i = 0; i < event.tags.length; i++) {
        const tag = event.tags[i];
        if (!Array.isArray(tag)) return "Invalid tag structure";
        for (let j = 0; j < tag.length; j++) {
            if (typeof tag[j] === "object") return "Invalid tag value";
        }
    }

    return true;
}