<?php
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

add_action( 'init', 'elementsell_ensure_privacy_page', 12 );

const ELEMENTSELL_PRIVACY_CONTENT_VERSION = 2;

/**
 * @return string
 */
function elementsell_get_default_privacy_page_slug() {
    return 'ochrana-osobnich-udaju';
}

/**
 * @return array{
 *     operator_name: string,
 *     operator_address: string,
 *     operator_ico: string,
 *     operator_dic: string,
 *     contact_email: string,
 *     website_url: string,
 *     website_name: string,
 *     effective_date: string
 * }
 */
function elementsell_collect_privacy_page_data() {
    $site_name = trim( (string) get_bloginfo( 'name' ) );
    $site_url  = home_url( '/' );

    $operator_name = trim( (string) get_option( 'faktury_jmeno', '' ) );
    if ( $operator_name === '' ) {
        $operator_name = $site_name !== '' ? $site_name : wp_parse_url( $site_url, PHP_URL_HOST );
    }

    $operator_address = trim( (string) get_option( 'faktury_adresa', '' ) );
    $operator_ico     = trim( (string) get_option( 'faktury_ico', '' ) );
    $operator_dic     = trim( (string) get_option( 'faktury_dic', '' ) );

    $invoice_email = function_exists( 'elementsell_get_invoice_supplier_email' )
        ? sanitize_email( elementsell_get_invoice_supplier_email() )
        : sanitize_email( (string) get_option( 'faktury_email', '' ) );
    $admin_email   = sanitize_email( (string) get_option( 'admin_email', '' ) );
    $contact_email = $invoice_email !== '' ? $invoice_email : $admin_email;

    $website_url = $site_url;

    return [
        'operator_name'    => $operator_name,
        'operator_address' => $operator_address,
        'operator_ico'     => $operator_ico,
        'operator_dic'     => $operator_dic,
        'contact_email'    => $contact_email,
        'website_url'      => $website_url,
        'website_name'     => $site_name !== '' ? $site_name : $operator_name,
        'effective_date'   => wp_date( 'j. n. Y' ),
    ];
}

/**
 * @param string $value
 * @return string
 */
function elementsell_privacy_format_multiline( $value ) {
    return nl2br( esc_html( trim( (string) $value ) ) );
}

/**
 * @return string
 */
function elementsell_get_default_privacy_page_content() {
    $data = elementsell_collect_privacy_page_data();

    $operator_lines   = [];
    $operator_lines[] = '<strong>' . esc_html( $data['operator_name'] ) . '</strong>';

    if ( $data['operator_address'] !== '' ) {
        $operator_lines[] = elementsell_privacy_format_multiline( $data['operator_address'] );
    }

    if ( $data['operator_ico'] !== '' ) {
        $operator_lines[] = 'IČO: ' . esc_html( $data['operator_ico'] );
    }

    if ( $data['operator_dic'] !== '' ) {
        $operator_lines[] = 'DIČ: ' . esc_html( $data['operator_dic'] );
    }

    if ( $data['contact_email'] !== '' ) {
        $operator_lines[] = 'E-mail: <a href="mailto:' . esc_attr( $data['contact_email'] ) . '">' . esc_html( $data['contact_email'] ) . '</a>';
    }

    $operator_lines[] = 'Web: <a href="' . esc_url( $data['website_url'] ) . '">' . esc_html( $data['website_name'] ) . '</a>';

    $content  = '<h2>Zásady zpracování osobních údajů</h2>';
    $content .= '<p>Tyto zásady popisují, jakým způsobem jsou zpracovávány osobní údaje návštěvníků a zákazníků webu <strong>' . esc_html( $data['website_name'] ) . '</strong> dostupného na adrese <a href="' . esc_url( $data['website_url'] ) . '">' . esc_html( $data['website_url'] ) . '</a>. Dokument je účinný od ' . esc_html( $data['effective_date'] ) . '.</p>';

    $content .= '<ol>';

    $content .= '<li><strong>Správce osobních údajů</strong><p>Správcem osobních údajů je:</p><p>' . implode( '<br>', $operator_lines ) . '</p></li>';

    $content .= '<li><strong>Rozsah zpracovávaných osobních údajů</strong><p>V souvislosti s objednávkou produktů nebo služeb prostřednictvím objednávkového formuláře na tomto webu zpracováváme zejména tyto údaje:</p><ul>';
    $content .= '<li>jméno a příjmení,</li>';
    $content .= '<li>e-mailovou adresu,</li>';
    $content .= '<li>telefonní číslo,</li>';
    $content .= '<li>fakturační a kontaktní údaje (adresa, firma, IČO, DIČ), pokud je zákazník vyplní,</li>';
    $content .= '<li>informace o objednávce, zaplacené částce a způsobu platby,</li>';
    $content .= '<li>technické údaje související s průběhem platby a doručením obsahu.</li>';
    $content .= '</ul><p>Údaje jsou poskytovány přímo zákazníkem vyplněním formuláře na webu.</p></li>';

    $content .= '<li><strong>Účel a právní základ zpracování</strong><p>Osobní údaje zpracováváme za těchto účelů:</p><ul>';
    $content .= '<li>vyřízení objednávky a plnění smlouvy se zákazníkem,</li>';
    $content .= '<li>vystavení daňového dokladu a splnění souvisejících zákonných povinností,</li>';
    $content .= '<li>zajištění platebního styku prostřednictvím platební brány,</li>';
    $content .= '<li>zasílání potvrzení objednávky, přístupových údajů a související zákaznické komunikace,</li>';
    $content .= '<li>ochrana práv a oprávněných zájmů správce, zejména při řešení reklamací a sporů.</li>';
    $content .= '</ul><p>Právním základem zpracování je plnění smlouvy, plnění právních povinností správce a oprávněný zájem správce na zajištění bezpečného provozu webu a evidence objednávek.</p></li>';

    $content .= '<li><strong>Doba uchovávání údajů</strong><p>Osobní údaje uchováváme po dobu nezbytnou k vyřízení objednávky a plnění smlouvy. Účetní a daňové doklady a související údaje jsou uchovávány po dobu stanovenou platnými právními předpisy České republiky, zejména zákonem o účetnictví a zákonem o DPH. Po uplynutí zákonných lhůt jsou údaje bezpečně odstraněny nebo anonymizovány.</p></li>';

    $content .= '<li><strong>Příjemci a zpracovatelé osobních údajů</strong><p>Osobní údaje mohou být v nezbytném rozsahu zpřístupněny těmto kategoriím příjemců:</p><ul>';
    $content .= '<li>poskytovatelům platebních služeb a platebních bran používaných pro přijetí platby,</li>';
    $content .= '<li>poskytovatelům e-mailových a hostingových služeb zajišťujícím provoz webu,</li>';
    $content .= '<li>účetním, daňovým a právním poradcům v rozsahu nezbytném pro plnění zákonných povinností,</li>';
    $content .= '<li>orgánům veřejné moci, pokud to vyžaduje zákon.</li>';
    $content .= '</ul><p>Údaje nejsou prodávány třetím stranám ani předávány do třetích zemí mimo standardní provoz služeb nezbytných pro realizaci objednávky, pokud není pro konkrétní službu sjednáno jinak.</p></li>';

    $content .= '<li><strong>Práva subjektu údajů</strong><p>Zákazník má v souladu s nařízením GDPR právo:</p><ul>';
    $content .= '<li>požadovat přístup ke svým osobním údajům,</li>';
    $content .= '<li>požadovat opravu nepřesných nebo doplnění neúplných údajů,</li>';
    $content .= '<li>požadovat výmaz údajů, pokud pro to existují zákonné důvody,</li>';
    $content .= '<li>požadovat omezení zpracování,</li>';
    $content .= '<li>vznést námitku proti zpracování založenému na oprávněném zájmu,</li>';
    $content .= '<li>požadovat přenositelnost údajů, pokud je to použitelné,</li>';
    $content .= '<li>podat stížnost u Úřadu pro ochranu osobních údajů (<a href="https://www.uoou.cz" target="_blank" rel="noopener noreferrer">www.uoou.cz</a>).</li>';
    $content .= '</ul></li>';

    $content .= '<li><strong>Zabezpečení osobních údajů</strong><p>Správce přijímá přiměřená technická a organizační opatření k ochraně osobních údajů před ztrátou, zneužitím, neoprávněným přístupem, změnou nebo zničením. Přístup k údajům mají pouze osoby a služby, pro které je tento přístup nezbytný pro vyřízení objednávky a provoz webu.</p></li>';

    if ( $data['contact_email'] !== '' ) {
        $content .= '<li><strong>Kontakt pro uplatnění práv</strong><p>Veškeré žádosti týkající se zpracování osobních údajů zasílejte na e-mailovou adresu <a href="mailto:' . esc_attr( $data['contact_email'] ) . '">' . esc_html( $data['contact_email'] ) . '</a>. Správce na žádost odpoví bez zbytečného odkladu, nejpozději do jednoho měsíce.</p></li>';
    } else {
        $content .= '<li><strong>Kontakt pro uplatnění práv</strong><p>Veškeré žádosti týkající se zpracování osobních údajů zasílejte prostřednictvím kontaktních údajů uvedených na webu <a href="' . esc_url( $data['website_url'] ) . '">' . esc_html( $data['website_name'] ) . '</a>. Správce na žádost odpoví bez zbytečného odkladu, nejpozději do jednoho měsíce.</p></li>';
    }

    $content .= '<li><strong>Souhlas při odeslání objednávky</strong><p>Odesláním objednávky prostřednictvím platebního formuláře na webu zákazník potvrzuje, že se seznámil s těmito zásadami zpracování osobních údajů a že poskytnuté údaje jsou pravdivé.</p></li>';

    $content .= '</ol>';

    return $content;
}

/**
 * @param int $page_id
 * @return void
 */
function elementsell_mark_privacy_page_as_managed( $page_id ) {
    $page_id = (int) $page_id;

    if ( $page_id <= 0 ) {
        return;
    }

    update_post_meta( $page_id, '_elementsell_privacy_auto', '1' );
    update_post_meta( $page_id, '_elementsell_privacy_content_version', ELEMENTSELL_PRIVACY_CONTENT_VERSION );
}

/**
 * @param int $page_id
 * @return void
 */
function elementsell_maybe_refresh_privacy_page_content( $page_id ) {
    $page_id = (int) $page_id;

    if ( $page_id <= 0 ) {
        return;
    }

    $is_managed = get_post_meta( $page_id, '_elementsell_privacy_auto', true ) === '1';
    $page       = get_post( $page_id );

    if ( ! $is_managed && $page instanceof WP_Post ) {
        if ( strpos( $page->post_content, 'Tento text je obecný vzor' ) !== false ) {
            $is_managed = true;
            update_post_meta( $page_id, '_elementsell_privacy_auto', '1' );
        }
    }

    if ( ! $is_managed ) {
        return;
    }

    $stored_version = (int) get_post_meta( $page_id, '_elementsell_privacy_content_version', true );

    if ( $stored_version >= ELEMENTSELL_PRIVACY_CONTENT_VERSION ) {
        return;
    }

    wp_update_post(
        [
            'ID'           => $page_id,
            'post_content' => elementsell_get_default_privacy_page_content(),
        ]
    );

    update_post_meta( $page_id, '_elementsell_privacy_content_version', ELEMENTSELL_PRIVACY_CONTENT_VERSION );
}

/**
 * @return int
 */
function elementsell_ensure_privacy_page() {
    if ( elementsell_is_elementor_context() ) {
        return (int) get_option( 'elementsell_privacy_page_id', 0 );
    }

    $wp_privacy_page_id = (int) get_option( 'wp_page_for_privacy_policy', 0 );

    if ( $wp_privacy_page_id > 0 && get_post_status( $wp_privacy_page_id ) === 'publish' ) {
        return $wp_privacy_page_id;
    }

    $page_id = (int) get_option( 'elementsell_privacy_page_id', 0 );

    if ( $page_id > 0 && get_post_status( $page_id ) === 'publish' ) {
        elementsell_maybe_refresh_privacy_page_content( $page_id );
        return $page_id;
    }

    $slug     = elementsell_get_default_privacy_page_slug();
    $existing = get_page_by_path( $slug );

    if ( $existing instanceof WP_Post && $existing->post_status === 'publish' ) {
        update_option( 'elementsell_privacy_page_id', (int) $existing->ID );
        elementsell_maybe_refresh_privacy_page_content( (int) $existing->ID );

        return (int) $existing->ID;
    }

    $page_id = wp_insert_post(
        [
            'post_title'   => 'Ochrana osobních údajů',
            'post_name'    => $slug,
            'post_status'  => 'publish',
            'post_type'    => 'page',
            'post_content' => elementsell_get_default_privacy_page_content(),
        ],
        true
    );

    if ( is_wp_error( $page_id ) ) {
        error_log( 'ElementSell: nepodařilo se vytvořit stránku ochrany osobních údajů: ' . $page_id->get_error_message() );
        return 0;
    }

    update_option( 'elementsell_privacy_page_id', (int) $page_id );
    elementsell_mark_privacy_page_as_managed( (int) $page_id );

    return (int) $page_id;
}

/**
 * @return string
 */
function elementsell_get_privacy_page_url() {
    $page_id = elementsell_ensure_privacy_page();

    if ( $page_id > 0 ) {
        $permalink = get_permalink( $page_id );

        if ( $permalink ) {
            return $permalink;
        }
    }

    return home_url( '/' . elementsell_get_default_privacy_page_slug() . '/' );
}

/**
 * @param bool $is_preview
 * @return void
 */
function elementsell_render_payment_consent_notice( $is_preview = false ) {
    $privacy_url = $is_preview ? '#' : elementsell_get_privacy_page_url();
    ?>
    <p class="elementsell-payment-consent">
        <?php
        printf(
            'Kliknutím souhlasíte se %1$szpracováním osobních údajů%2$s.',
            '<a href="' . esc_url( $privacy_url ) . '" target="_blank" rel="noopener noreferrer">',
            '</a>'
        );
        ?>
    </p>
    <?php
}
