<?php
/**
 * Schema Detectie Storage
 *
 * Beheert opslag van schema keuzes in post meta
 * Onderscheidt handmatige keuzes van automatische detecties
 *
 * @package TamRank
 * @subpackage Schema\Detector
 * @since 1.0.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

/**
 * Klasse TAMRANK_Schema_Storage
 *
 * Leest en schrijft schema keuzes naar post meta
 */
class TAMRANK_Schema_Storage {

    /**
     * Meta sleutel voor handmatig gekozen hoofd schema
     */
    const META_HANDMATIG_TYPE = '_tamrank_schema_manual_type';

    /**
     * Meta sleutel voor handmatig gekozen extra schema's
     */
    const META_HANDMATIG_EXTRAS = '_tamrank_schema_manual_extras';

    /**
     * Meta sleutel voor automatisch gedetecteerd hoofd schema
     */
    const META_AUTO_TYPE = '_tamrank_schema_auto_type';

    /**
     * Meta sleutel voor automatisch gedetecteerde extra schema's
     */
    const META_AUTO_EXTRAS = '_tamrank_schema_auto_extras';

    /**
     * Meta sleutel voor betrouwbaarheid van automatische detectie
     */
    const META_AUTO_CONFIDENCE = '_tamrank_schema_auto_confidence';

    /**
     * Meta sleutel voor detectie details (voor debugging)
     */
    const META_AUTO_DETAILS = '_tamrank_schema_auto_details';

    /**
     * Meta sleutel voor tijdstip van laatste detectie
     */
    const META_AUTO_TIMESTAMP = '_tamrank_schema_auto_timestamp';

    /**
     * Meta sleutel om aan te geven dat gebruiker handmatige modus heeft gekozen
     */
    const META_HANDMATIG_ACTIEF = '_tamrank_schema_manual_active';

    /**
     * Sla een handmatige schema keuze op
     *
     * @param int         $post_id      Post ID
     * @param string      $hoofd_type   Hoofd schema type
     * @param array       $extra_types  Extra schema types
     * @return bool True bij succes
     */
    public function sla_handmatige_keuze_op( $post_id, $hoofd_type, $extra_types = array() ) {
        $post_id = absint( $post_id );

        if ( ! $post_id ) {
            return false;
        }

        // Valideer hoofd type
        if ( ! in_array( $hoofd_type, TAMRANK_Schema_Detection_Result::SCHEMA_TYPES, true ) ) {
            return false;
        }

        // Valideer extra types
        $geldige_extras = array();
        foreach ( $extra_types as $type ) {
            if ( in_array( $type, TAMRANK_Schema_Detection_Result::EXTRA_SCHEMA_TYPES, true ) ) {
                $geldige_extras[] = $type;
            }
        }

        // Sla op
        update_post_meta( $post_id, self::META_HANDMATIG_TYPE, $hoofd_type );
        update_post_meta( $post_id, self::META_HANDMATIG_EXTRAS, $geldige_extras );
        update_post_meta( $post_id, self::META_HANDMATIG_ACTIEF, '1' );

        /**
         * Actie na opslaan handmatige schema keuze
         *
         * @param int    $post_id      Post ID
         * @param string $hoofd_type   Hoofd schema type
         * @param array  $extra_types  Extra schema types
         */
        do_action( 'tamrank_schema_handmatige_keuze_opgeslagen', $post_id, $hoofd_type, $geldige_extras );

        return true;
    }

    /**
     * Sla automatische detectie resultaat op
     *
     * @param int                              $post_id   Post ID
     * @param TAMRANK_Schema_Detection_Result  $resultaat Detectie resultaat
     * @return bool True bij succes
     */
    public function sla_detectie_resultaat_op( $post_id, TAMRANK_Schema_Detection_Result $resultaat ) {
        $post_id = absint( $post_id );

        if ( ! $post_id ) {
            return false;
        }


        update_post_meta( $post_id, self::META_AUTO_TYPE, $resultaat->krijg_hoofd_schema() );
        update_post_meta( $post_id, self::META_AUTO_EXTRAS, $resultaat->krijg_extra_schemas() );
        update_post_meta( $post_id, self::META_AUTO_CONFIDENCE, $resultaat->krijg_betrouwbaarheid() );
        update_post_meta( $post_id, self::META_AUTO_DETAILS, $resultaat->krijg_details() );
        update_post_meta( $post_id, self::META_AUTO_TIMESTAMP, time() );

        /**
         * Actie na opslaan detectie resultaat
         *
         * @param int                              $post_id   Post ID
         * @param TAMRANK_Schema_Detection_Result  $resultaat Detectie resultaat
         */
        do_action( 'tamrank_schema_detectie_opgeslagen', $post_id, $resultaat );

        return true;
    }

    /**
     * Haal de effectieve schema keuze op
     *
     * Geeft handmatige keuze terug als deze bestaat,
     * anders de automatische detectie
     *
     * @param int $post_id Post ID
     * @return TAMRANK_Schema_Effective_Choice|null
     */
    public function krijg_effectief_schema( $post_id ) {
        $post_id = absint( $post_id );

        if ( ! $post_id ) {
            return null;
        }

        // Check eerst de expliciete bron keuze (tamrank_schema_bron)
        // Dit is de "master switch" die bepaalt of we automatisch of handmatig gebruiken
        $bron = get_post_meta( $post_id, 'tamrank_schema_bron', true );
        $handmatig_actief = get_post_meta( $post_id, self::META_HANDMATIG_ACTIEF, true );

        // Debug logging

        // Als bron expliciet op 'automatisch' staat, negeer handmatige keuze
        // Dit zorgt ervoor dat na Herdetecteer altijd de automatische detectie wordt gebruikt
        if ( $bron === 'automatisch' ) {
            // Wis eventueel nog aanwezige handmatige flag
            if ( $handmatig_actief === '1' ) {
                delete_post_meta( $post_id, self::META_HANDMATIG_ACTIEF );
            }
            // Ga direct naar automatische detectie
        } elseif ( $handmatig_actief === '1' || $bron === 'handmatig' ) {
            // Haal handmatige keuze op
            $hoofd_type  = get_post_meta( $post_id, self::META_HANDMATIG_TYPE, true );
            $extra_types = get_post_meta( $post_id, self::META_HANDMATIG_EXTRAS, true );

            if ( ! empty( $hoofd_type ) ) {
                return new TAMRANK_Schema_Effective_Choice(
                    $hoofd_type,
                    is_array( $extra_types ) ? $extra_types : array(),
                    'handmatig',
                    1.0  // Handmatige keuze heeft altijd 100% zekerheid
                );
            }
        }

        // Gebruik automatische detectie
        $auto_type       = get_post_meta( $post_id, self::META_AUTO_TYPE, true );
        $auto_extras     = get_post_meta( $post_id, self::META_AUTO_EXTRAS, true );
        $auto_confidence = get_post_meta( $post_id, self::META_AUTO_CONFIDENCE, true );

        // Debug logging

        if ( ! empty( $auto_type ) ) {
            return new TAMRANK_Schema_Effective_Choice(
                $auto_type,
                is_array( $auto_extras ) ? $auto_extras : array(),
                'automatisch',
                floatval( $auto_confidence )
            );
        }

        return null;
    }

    /**
     * Haal het automatische detectie resultaat op
     *
     * @param int $post_id Post ID
     * @return TAMRANK_Schema_Detection_Result|null
     */
    public function krijg_detectie_resultaat( $post_id ) {
        $post_id = absint( $post_id );

        if ( ! $post_id ) {
            return null;
        }

        $auto_type       = get_post_meta( $post_id, self::META_AUTO_TYPE, true );
        $auto_extras     = get_post_meta( $post_id, self::META_AUTO_EXTRAS, true );
        $auto_confidence = get_post_meta( $post_id, self::META_AUTO_CONFIDENCE, true );
        $auto_details    = get_post_meta( $post_id, self::META_AUTO_DETAILS, true );
        $auto_timestamp  = get_post_meta( $post_id, self::META_AUTO_TIMESTAMP, true );

        if ( empty( $auto_type ) ) {
            return null;
        }

        $resultaat = new TAMRANK_Schema_Detection_Result( $post_id );
        $resultaat->stel_hoofd_schema_in( $auto_type );

        if ( is_array( $auto_extras ) ) {
            $resultaat->stel_extra_schemas_in( $auto_extras );
        }

        $resultaat->stel_betrouwbaarheid_in( floatval( $auto_confidence ) );

        if ( is_array( $auto_details ) ) {
            foreach ( $auto_details as $sleutel => $waarde ) {
                $resultaat->voeg_detail_toe( $sleutel, $waarde );
            }
        }

        return $resultaat;
    }

    /**
     * Haal de handmatige keuze op
     *
     * @param int $post_id Post ID
     * @return array|null Array met 'type' en 'extras', of null als niet gevonden
     */
    public function krijg_handmatige_keuze( $post_id ) {
        $post_id = absint( $post_id );

        if ( ! $post_id ) {
            return null;
        }

        $handmatig_actief = get_post_meta( $post_id, self::META_HANDMATIG_ACTIEF, true );

        if ( $handmatig_actief !== '1' ) {
            return null;
        }

        $hoofd_type  = get_post_meta( $post_id, self::META_HANDMATIG_TYPE, true );
        $extra_types = get_post_meta( $post_id, self::META_HANDMATIG_EXTRAS, true );

        if ( empty( $hoofd_type ) ) {
            return null;
        }

        return array(
            'type'   => $hoofd_type,
            'extras' => is_array( $extra_types ) ? $extra_types : array(),
        );
    }

    /**
     * Controleer of een post een handmatige keuze heeft
     *
     * @param int $post_id Post ID
     * @return bool
     */
    public function heeft_handmatige_keuze( $post_id ) {
        $post_id = absint( $post_id );

        if ( ! $post_id ) {
            return false;
        }

        return get_post_meta( $post_id, self::META_HANDMATIG_ACTIEF, true ) === '1';
    }

    /**
     * Controleer of een post een automatische detectie heeft
     *
     * @param int $post_id Post ID
     * @return bool
     */
    public function heeft_detectie( $post_id ) {
        $post_id = absint( $post_id );

        if ( ! $post_id ) {
            return false;
        }

        $auto_type = get_post_meta( $post_id, self::META_AUTO_TYPE, true );
        return ! empty( $auto_type );
    }

    /**
     * Wis de handmatige keuze (alias voor verwijder_handmatige_keuze)
     *
     * @param int $post_id Post ID
     * @return bool True bij succes
     */
    public function wis_handmatige_keuze( $post_id ) {
        return $this->verwijder_handmatige_keuze( $post_id );
    }

    /**
     * Verwijder de handmatige keuze (schakel terug naar automatisch)
     *
     * @param int $post_id Post ID
     * @return bool True bij succes
     */
    public function verwijder_handmatige_keuze( $post_id ) {
        $post_id = absint( $post_id );

        if ( ! $post_id ) {
            return false;
        }

        delete_post_meta( $post_id, self::META_HANDMATIG_TYPE );
        delete_post_meta( $post_id, self::META_HANDMATIG_EXTRAS );
        delete_post_meta( $post_id, self::META_HANDMATIG_ACTIEF );

        /**
         * Actie na verwijderen handmatige schema keuze
         *
         * @param int $post_id Post ID
         */
        do_action( 'tamrank_schema_handmatige_keuze_verwijderd', $post_id );

        return true;
    }

    /**
     * Verwijder het detectie resultaat
     *
     * @param int $post_id Post ID
     * @return bool True bij succes
     */
    public function verwijder_detectie_resultaat( $post_id ) {
        $post_id = absint( $post_id );

        if ( ! $post_id ) {
            return false;
        }

        delete_post_meta( $post_id, self::META_AUTO_TYPE );
        delete_post_meta( $post_id, self::META_AUTO_EXTRAS );
        delete_post_meta( $post_id, self::META_AUTO_CONFIDENCE );
        delete_post_meta( $post_id, self::META_AUTO_DETAILS );
        delete_post_meta( $post_id, self::META_AUTO_TIMESTAMP );

        return true;
    }




}

/**
 * Klasse TAMRANK_Schema_Effective_Choice
 *
 * Representeert de effectieve schema keuze (handmatig of automatisch)
 */
class TAMRANK_Schema_Effective_Choice {

    /**
     * Hoofd schema type
     *
     * @var string
     */
    private $hoofd_type;

    /**
     * Extra schema types
     *
     * @var array
     */
    private $extra_types;

    /**
     * Bron van de keuze ('handmatig' of 'automatisch')
     *
     * @var string
     */
    private $bron;

    /**
     * Betrouwbaarheid van de keuze
     *
     * @var float
     */
    private $betrouwbaarheid;

    /**
     * Constructor
     *
     * @param string $hoofd_type       Hoofd schema type
     * @param array  $extra_types      Extra schema types
     * @param string $bron             Bron van de keuze
     * @param float  $betrouwbaarheid  Betrouwbaarheid (0.0 tot 1.0)
     */
    public function __construct( $hoofd_type, $extra_types, $bron, $betrouwbaarheid ) {
        $this->hoofd_type      = $hoofd_type;
        $this->extra_types     = $extra_types;
        $this->bron            = $bron;
        $this->betrouwbaarheid = $betrouwbaarheid;
    }

    /**
     * Haal het hoofd type op
     *
     * @return string
     */
    public function get_main_type() {
        return $this->hoofd_type;
    }

    /**
     * Haal extra types op
     *
     * @return array
     */
    public function get_extra_types() {
        return $this->extra_types;
    }

    /**
     * Haal de bron op
     *
     * @return string
     */
    public function krijg_bron() {
        return $this->bron;
    }



    /**
     * Haal de betrouwbaarheid op
     *
     * @return float
     */
    public function krijg_betrouwbaarheid() {
        return $this->betrouwbaarheid;
    }

    /**
     * Converteer naar array
     *
     * @return array
     */
    public function naar_array() {
        return array(
            'hoofd_type'      => $this->hoofd_type,
            'extra_types'     => $this->extra_types,
            'bron'            => $this->bron,
            'betrouwbaarheid' => $this->betrouwbaarheid,
        );
    }
}
