module Deontic.Civil.AgencyRemedies () where

import Data.Set qualified as Set
import Deontic.Core.Types
import Deontic.Core.Verdict
import Deontic.Core.Adjudicate
import Deontic.Core.Layer (Base, Proviso, Resolvable)
import Deontic.Civil.Types

type instance Resolvable AgencyWithdrawalAct = '[CounterpartyKnowledge, Base]

instance Adjudicate AgencyWithdrawalAct '[Base] where
  adjudicate :: AgencyWithdrawalAct
-> Facts AgencyWithdrawalAct -> Judgment '[Base]
adjudicate AgencyWithdrawalAct
_ Facts AgencyWithdrawalAct
_ =
    Verdict -> ArticleRef -> Text -> Judgment '[Base]
forall l. Verdict -> ArticleRef -> Text -> Judgment '[l]
JBase Verdict
Valid
      (Text -> Int -> Maybe Int -> ArticleRef
ArticleRef Text
"민법" Int
134 Maybe Int
forall a. Maybe a
Nothing)
      Text
"본인의 추인이 있을 때까지 상대방은 본인이나 그 대리인에 대하여 철회할 수 있다."

instance Adjudicate AgencyWithdrawalAct rest
      => Adjudicate AgencyWithdrawalAct (CounterpartyKnowledge ': rest) where
  adjudicate :: AgencyWithdrawalAct
-> Facts AgencyWithdrawalAct
-> Judgment (CounterpartyKnowledge : rest)
adjudicate AgencyWithdrawalAct
act Facts AgencyWithdrawalAct
facts
    | CivilFact -> Set CivilFact -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member CivilFact
CounterpartyKnewNoAuthority Set CivilFact
Facts AgencyWithdrawalAct
facts =
        Judgment rest
-> Verdict
-> ArticleRef
-> Text
-> Judgment (CounterpartyKnowledge : rest)
forall (prev :: [*]) l.
Judgment prev
-> Verdict -> ArticleRef -> Text -> Judgment (l : prev)
JOverride (forall act (layers :: [*]).
Adjudicate act layers =>
act -> Facts act -> Judgment layers
adjudicate @_ @rest AgencyWithdrawalAct
act Facts AgencyWithdrawalAct
facts)
                  Verdict
Void
                  (Text -> Int -> Maybe Int -> ArticleRef
ArticleRef Text
"민법" Int
134 Maybe Int
forall a. Maybe a
Nothing)
                  Text
"계약 당시에 상대방이 대리권 없음을 안 때에는 철회하지 못한다."
    | Bool
otherwise =
        Judgment rest -> Judgment (CounterpartyKnowledge : rest)
forall (prev :: [*]) l. Judgment prev -> Judgment (l : prev)
JDelegate (forall act (layers :: [*]).
Adjudicate act layers =>
act -> Facts act -> Judgment layers
adjudicate @_ @rest AgencyWithdrawalAct
act Facts AgencyWithdrawalAct
facts)

type instance Resolvable AgentLiabilityAct = '[Proviso, Base]

instance Adjudicate AgentLiabilityAct '[Base] where
  adjudicate :: AgentLiabilityAct -> Facts AgentLiabilityAct -> Judgment '[Base]
adjudicate AgentLiabilityAct
_ Facts AgentLiabilityAct
_ =
    Verdict -> ArticleRef -> Text -> Judgment '[Base]
forall l. Verdict -> ArticleRef -> Text -> Judgment '[l]
JBase Verdict
Void
      (Text -> Int -> Maybe Int -> ArticleRef
ArticleRef Text
"민법" Int
135 (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
1))
      Text
"대리권을 증명하지 못하고 본인의 추인을 받지 못한 자는 상대방의 선택에 따라 이행 또는 손해배상의 책임이 있다."

instance Adjudicate AgentLiabilityAct rest
      => Adjudicate AgentLiabilityAct (Proviso ': rest) where
  adjudicate :: AgentLiabilityAct
-> Facts AgentLiabilityAct -> Judgment (Proviso : rest)
adjudicate AgentLiabilityAct
act Facts AgentLiabilityAct
facts
    | CivilFact -> Set CivilFact -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member CivilFact
CounterpartyKnewNoAuthority Set CivilFact
Facts AgentLiabilityAct
facts =
        Judgment rest
-> Verdict -> ArticleRef -> Text -> Judgment (Proviso : rest)
forall (prev :: [*]) l.
Judgment prev
-> Verdict -> ArticleRef -> Text -> Judgment (l : prev)
JOverride (forall act (layers :: [*]).
Adjudicate act layers =>
act -> Facts act -> Judgment layers
adjudicate @_ @rest AgentLiabilityAct
act Facts AgentLiabilityAct
facts)
                  Verdict
Valid
                  (Text -> Int -> Maybe Int -> ArticleRef
ArticleRef Text
"민법" Int
135 (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
2))
                  Text
"상대방이 대리권 없음을 안 때에는 무권대리인의 책임이 없다."
    | CivilFact -> Set CivilFact -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member CivilFact
CounterpartyCouldHaveKnown Set CivilFact
Facts AgentLiabilityAct
facts =
        Judgment rest
-> Verdict -> ArticleRef -> Text -> Judgment (Proviso : rest)
forall (prev :: [*]) l.
Judgment prev
-> Verdict -> ArticleRef -> Text -> Judgment (l : prev)
JOverride (forall act (layers :: [*]).
Adjudicate act layers =>
act -> Facts act -> Judgment layers
adjudicate @_ @rest AgentLiabilityAct
act Facts AgentLiabilityAct
facts)
                  Verdict
Valid
                  (Text -> Int -> Maybe Int -> ArticleRef
ArticleRef Text
"민법" Int
135 (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
2))
                  Text
"상대방이 대리권 없음을 알 수 있었을 때에는 무권대리인의 책임이 없다."
    | CivilFact -> Set CivilFact -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member CivilFact
AgentIsLimitedCapacity Set CivilFact
Facts AgentLiabilityAct
facts =
        Judgment rest
-> Verdict -> ArticleRef -> Text -> Judgment (Proviso : rest)
forall (prev :: [*]) l.
Judgment prev
-> Verdict -> ArticleRef -> Text -> Judgment (l : prev)
JOverride (forall act (layers :: [*]).
Adjudicate act layers =>
act -> Facts act -> Judgment layers
adjudicate @_ @rest AgentLiabilityAct
act Facts AgentLiabilityAct
facts)
                  Verdict
Valid
                  (Text -> Int -> Maybe Int -> ArticleRef
ArticleRef Text
"민법" Int
135 (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
2))
                  Text
"대리인이 제한능력자인 때에는 무권대리인의 책임이 없다."
    | Bool
otherwise =
        Judgment rest -> Judgment (Proviso : rest)
forall (prev :: [*]) l. Judgment prev -> Judgment (l : prev)
JDelegate (forall act (layers :: [*]).
Adjudicate act layers =>
act -> Facts act -> Judgment layers
adjudicate @_ @rest AgentLiabilityAct
act Facts AgentLiabilityAct
facts)